"เรียกมันว่า TCP/2 อีกครั้งหนึ่ง"
โปรเจ็กต์ ngtcp2 เป็นความพยายามในการใช้โปรโตคอล RFC9000 QUIC
มีเอกสารออนไลน์
ตำแหน่งข้อมูลต่อไปนี้พร้อมให้ลองใช้การใช้งาน ngtcp2:
https://nghttp2.org:4433
https://nghttp2.org:4434 (ต้องมีโทเค็นการตรวจสอบที่อยู่)
https://nghttp2.org (สนับสนุนโดย nghttpx)
ตำแหน่งข้อมูลนี้จะส่งฟิลด์ส่วนหัว Alt-Svc ไปยังไคลเอนต์หากมีการเข้าถึงผ่าน HTTP/1.1 หรือ HTTP/2 เพื่อแจ้งให้ทราบว่า HTTP/3 พร้อมใช้งานที่ UDP 443
ไลบรารี libngtcp2 C เองไม่ได้ขึ้นอยู่กับไลบรารีภายนอกใดๆ ไคลเอนต์และเซิร์ฟเวอร์ตัวอย่างเขียนด้วยภาษา C++20 และควรคอมไพล์ด้วยคอมไพเลอร์ C++ สมัยใหม่ (เช่น clang >= 11.0 หรือ gcc >= 11.0)
แพ็คเกจต่อไปนี้จำเป็นสำหรับการกำหนดค่าระบบบิลด์:
หากต้องการสร้างซอร์สภายใต้ไดเร็กทอรีตัวอย่าง จำเป็นต้องมี libev และ nghttp3:
หากต้องการเปิดใช้งานการบีบอัดใบรับรอง TLS ใน bsslclient และ bsslserver (ไคลเอนต์และเซิร์ฟเวอร์ตัวอย่าง BoringSSL (aws-lc)) จำเป็นต้องมีไลบรารีต่อไปนี้:
ไลบรารีตัวช่วย crypto ngtcp2 และไคลเอ็นต์และเซิร์ฟเวอร์ภายใต้ไดเรกทอรีตัวอย่างต้องมีแบ็กเอนด์ TLS ต่อไปนี้อย่างน้อยหนึ่งรายการ:
เมื่อสร้างจาก git ให้รันคำสั่งต่อไปนี้เพื่อดึงโมดูลย่อย:
$ git submodule update --init
$ git clone --depth 1 -b v5.7.4-stable https://github.com/wolfSSL/wolfssl
$ cd wolfssl
$ autoreconf -i
$ # For wolfSSL < v5.6.6, append --enable-quic.
$ ./configure --prefix= $PWD /build
--enable-all --enable-aesni --enable-harden --enable-keylog-export
--disable-ech
$ make -j $( nproc )
$ make install
$ cd ..
$ git clone --recursive https://github.com/ngtcp2/nghttp3
$ cd nghttp3
$ autoreconf -i
$ ./configure --prefix= $PWD /build --enable-lib-only
$ make -j $( nproc ) check
$ make install
$ cd ..
$ git clone --recursive https://github.com/ngtcp2/ngtcp2
$ cd ngtcp2
$ autoreconf -i
$ # For Mac users who have installed libev with MacPorts, append
$ # LIBEV_CFLAGS="-I/opt/local/include" LIBEV_LIBS="-L/opt/local/lib -lev"
$ ./configure PKG_CONFIG_PATH= $PWD /../wolfssl/build/lib/pkgconfig: $PWD /../nghttp3/build/lib/pkgconfig
--with-wolfssl
$ make -j $( nproc ) check
$ git clone https://boringssl.googlesource.com/boringssl
$ cd boringssl
$ git checkout 83fc0d94d7040544480d42db01554f2421cfc081
$ cmake -B build -DCMAKE_POSITION_INDEPENDENT_CODE=ON
$ make -j $( nproc ) -C build
$ cd ..
$ git clone --recursive https://github.com/ngtcp2/nghttp3
$ cd nghttp3
$ autoreconf -i
$ ./configure --prefix= $PWD /build --enable-lib-only
$ make -j $( nproc ) check
$ make install
$ cd ..
$ git clone --recursive https://github.com/ngtcp2/ngtcp2
$ cd ngtcp2
$ autoreconf -i
$ # For Mac users who have installed libev with MacPorts, append
$ # LIBEV_CFLAGS="-I/opt/local/include" LIBEV_LIBS="-L/opt/local/lib -lev"
$ ./configure PKG_CONFIG_PATH= $PWD /../nghttp3/build/lib/pkgconfig
BORINGSSL_LIBS= " -L $PWD /../boringssl/build/ssl -lssl -L $PWD /../boringssl/build/crypto -lcrypto "
BORINGSSL_CFLAGS= " -I $PWD /../boringssl/include "
--with-boringssl
$ make -j $( nproc ) check
$ git clone --depth 1 -b v1.39.0 https://github.com/aws/aws-lc
$ cd aws-lc
$ cmake -B build -DDISABLE_GO=ON
$ make -j $( nproc ) -C build
$ cd ..
$ git clone --recursive https://github.com/ngtcp2/nghttp3
$ cd nghttp3
$ autoreconf -i
$ ./configure --prefix= $PWD /build --enable-lib-only
$ make -j $( nproc ) check
$ make install
$ cd ..
$ git clone --recursive https://github.com/ngtcp2/ngtcp2
$ cd ngtcp2
$ autoreconf -i
$ # For Mac users who have installed libev with MacPorts, append
$ # LIBEV_CFLAGS="-I/opt/local/include" LIBEV_LIBS="-L/opt/local/lib -lev"
$ ./configure PKG_CONFIG_PATH= $PWD /../nghttp3/build/lib/pkgconfig
BORINGSSL_CFLAGS= " -I $PWD /../aws-lc/include "
BORINGSSL_LIBS= " -L $PWD /../aws-lc/build/ssl -lssl -L $PWD /../aws-lc/build/crypto -lcrypto "
--with-boringssl
$ make -j $( nproc ) check
$ git clone --depth 1 -b v4.0.0 https://github.com/libressl/portable.git libressl
$ cd libressl
$ # Workaround autogen.sh failure
$ export LIBRESSL_GIT_OPTIONS= " -b libressl-v4.0.0 "
$ ./autogen.sh
$ ./configure --prefix= $PWD /build
$ make -j $( nproc ) install
$ cd ..
$ git clone --recursive https://github.com/ngtcp2/nghttp3
$ cd nghttp3
$ autoreconf -i
$ ./configure --prefix= $PWD /build --enable-lib-only
$ make -j $( nproc ) check
$ make install
$ cd ..
$ git clone --recursive https://github.com/ngtcp2/ngtcp2
$ cd ngtcp2
$ autoreconf -i
$ # For Mac users who have installed libev with MacPorts, append
$ # LIBEV_CFLAGS="-I/opt/homebrew/Cellar/libev/4.33/include" LIBEV_LIBS="-L/opt/homebrew/Cellar/libev/4.33/lib -lev"
$ ./configure PKG_CONFIG_PATH= $PWD /../nghttp3/build/lib/pkgconfig: $PWD /../libressl/build/lib/pkgconfig
$ make -j $( nproc ) check
หลังจากสร้างสำเร็จแล้ว ควรพบไฟล์ปฏิบัติการไคลเอนต์และเซิร์ฟเวอร์ภายใต้ไดเร็กทอรีตัวอย่าง พวกเขาพูด HTTP/3
$ examples/wsslclient [OPTIONS] < HOST > < PORT > [ < URI > ...]
ตัวเลือกที่โดดเด่นคือ:
-d
, --data=
: อ่านข้อมูลจาก $ examples/wsslserver [OPTIONS] < ADDR > < PORT > < PRIVATE_KEY_FILE > < CERTIFICATE_FILE >
ตัวเลือกที่โดดเด่นคือ:
-V
, --validate-addr
: บังคับใช้การตรวจสอบที่อยู่ไร้สัญชาติ มี h09wsslclient และ h09wsslserver ที่พูด HTTP/0.9 เขียนขึ้นเพื่อ quic-interop-runner เท่านั้น พวกเขาแชร์ฟังก์ชันพื้นฐานกับไคลเอ็นต์และเซิร์ฟเวอร์ HTTP/3 แต่มีฟังก์ชันน้อยกว่า (เช่น h09wsslclient ไม่มีความสามารถในการส่งเนื้อหาคำขอ และ h09wsslserver ไม่เข้าใจเส้นทางคำขอที่เป็นตัวเลข เช่น /1000)
เพื่อดำเนินการเซสชันต่อ จะต้องดึงตั๋วเซสชันและพารามิเตอร์การขนส่งจากเซิร์ฟเวอร์ ขั้นแรก ให้รัน example/wsslclient ด้วยตัวเลือก --session-file และ --tp-file ซึ่งระบุเส้นทางไปยังตั๋วเซสชัน และไฟล์พารามิเตอร์การขนส่งตามลำดับเพื่อบันทึกไว้ในเครื่อง
เมื่อไฟล์เหล่านี้พร้อมใช้งาน ให้รัน example/wsslclient ด้วยอาร์กิวเมนต์เดียวกันอีกครั้ง คุณจะเห็นว่าเซสชันนั้นดำเนินการต่อในบันทึกของคุณหากการเริ่มต้นใหม่สำเร็จ เซสชันที่ดำเนินการต่อทำให้แพ็กเก็ต Handshake แรกของเซิร์ฟเวอร์มีขนาดเล็กมาก เนื่องจากไม่ได้ส่งใบรับรอง
หากต้องการส่งข้อมูล 0-RTT หลังจากตรวจสอบให้แน่ใจว่าการเริ่มต้นใหม่ใช้งานได้ ให้ใช้ตัวเลือก -d เพื่อระบุไฟล์ที่มีข้อมูลที่จะส่ง
เซิร์ฟเวอร์ QUIC อาจส่งโทเค็นไปยังไคลเอนต์หลังจากสร้างการเชื่อมต่อแล้ว ลูกค้าสามารถส่งโทเค็นนี้ในการเชื่อมต่อครั้งต่อไปไปยังเซิร์ฟเวอร์ เซิร์ฟเวอร์จะตรวจสอบโทเค็น และหากสำเร็จ การตรวจสอบที่อยู่จะเสร็จสมบูรณ์และยกเลิกข้อจำกัดบางประการบนเซิร์ฟเวอร์ซึ่งอาจเพิ่มความเร็วในการถ่ายโอน หากต้องการบันทึกและ/หรือโหลดโทเค็น ให้ใช้ตัวเลือก --token-file ของ example/wsslclient ไฟล์ที่กำหนดจะถูกเขียนทับหากมีอยู่แล้วเมื่อจัดเก็บโทเค็น
เพื่อให้การรวมสแต็ก TLS ยุ่งยากน้อยลง เราจึงได้จัดเตรียมไลบรารีตัวช่วยเข้ารหัสลับซึ่งมีการดำเนินการเข้ารหัสขั้นพื้นฐาน
ไฟล์ส่วนหัวอยู่ภายใต้ไดเรกทอรี crypto/includes/ngtcp2
ไฟล์ไลบรารีแต่ละไฟล์ถูกสร้างขึ้นสำหรับแบ็กเอนด์ TLS โดยเฉพาะ ไลบรารีตัวช่วย crypto ที่มีอยู่คือ:
เนื่องจาก BoringSSL และ Picotls เป็นผลิตภัณฑ์ที่ไม่มีเวอร์ชัน เราจึงทดสอบเฉพาะการแก้ไขเฉพาะเท่านั้น ดูส่วนข้อกำหนดด้านบน
เราใช้ Picotls กับ OpenSSL เป็นแบ็กเอนด์ crypto
ไดเร็กทอรีตัวอย่างประกอบด้วยไคลเอนต์และเซิร์ฟเวอร์ที่เชื่อมโยงกับไลบรารีตัวช่วย crypto และแบ็กเอนด์ TLS พวกเขาจะถูกสร้างขึ้นก็ต่อเมื่อมีการสร้างไลบรารีตัวช่วย crypto ที่เกี่ยวข้อง:
ไลบรารีใช้ส่วนขยายโปรโตคอล QUIC ต่อไปนี้:
สามารถกำหนดค่า Wireshark เพื่อวิเคราะห์การรับส่งข้อมูล QUIC โดยใช้ขั้นตอนต่อไปนี้:
ตั้งค่าตัวแปรสภาพแวดล้อม SSLKEYLOGFILE :
$ export SSLKEYLOGFILE=quic_keylog_file
ตั้งค่าพอร์ตที่ QUIC ใช้
ไปที่ Preferences->Protocols->QUIC และตั้งค่าพอร์ตที่โปรแกรมจะรับฟัง ในกรณีของแอปพลิเคชันตัวอย่าง นี่จะเป็นพอร์ตที่ระบุในบรรทัดคำสั่ง
ตั้งค่าไฟล์บันทึก Pre-Master-Secret
ไปที่ Preferences->Protocols->TLS และตั้ง ค่าไฟล์บันทึก Pre-Master-Secret ให้เป็นค่าเดียวกับที่ระบุไว้สำหรับ SSLKEYLOGFILE
เลือกอินเทอร์เฟซเครือข่ายที่ถูกต้องสำหรับการจับภาพ
ตรวจสอบให้แน่ใจว่าคุณเลือกอินเทอร์เฟซเครือข่ายที่ถูกต้องสำหรับการจับภาพ ตัวอย่างเช่น หากใช้ localhost ให้เลือกอินเทอร์เฟซเครือข่าย แบบย้อนกลับ บน Macos
สร้างตัวกรอง
สร้างตัวกรองสำหรับ udp.port และตั้งค่าพอร์ตเป็นพอร์ตที่แอปพลิเคชันกำลังฟังอยู่ ตัวอย่างเช่น:
udp.พอร์ต == 7777
ใบอนุญาตเอ็มไอที
ลิขสิทธิ์ (c) 2016 ผู้ร่วมให้ข้อมูล ngtcp2