├── .gitignore ├── docs ├── http │ ├── 5.md │ ├── http2-4.md │ ├── imgs │ │ ├── h1-1.png │ │ ├── h1-2.png │ │ ├── h2-1.png │ │ ├── h2-2.png │ │ ├── h2-3.png │ │ ├── h2-4.png │ │ ├── h3-1.png │ │ ├── h3-2.png │ │ ├── h3-3.png │ │ ├── h3-4.png │ │ ├── h3-5.png │ │ ├── h3-6.png │ │ ├── h3-7.png │ │ ├── h3-8.png │ │ ├── h3-9.png │ │ ├── h4-1.png │ │ ├── h4-2.png │ │ ├── h4-3.png │ │ ├── h4-4.png │ │ ├── h4-5.png │ │ ├── h4-6.png │ │ ├── h4-7.png │ │ ├── h4-8.png │ │ ├── h4-9.png │ │ ├── h5-1.png │ │ ├── h6-1.png │ │ ├── h6-2.png │ │ ├── h6-3.png │ │ ├── h6-4.png │ │ ├── h6-5.png │ │ ├── h6-6.png │ │ ├── h6-7.png │ │ ├── h6-8.png │ │ ├── h6-9.png │ │ ├── h7-1.png │ │ ├── h7-2.png │ │ ├── h7-3.png │ │ ├── h7-4.png │ │ ├── h7-5.png │ │ ├── h7-6.png │ │ ├── h7-7.png │ │ ├── h7-8.png │ │ ├── h8-1.png │ │ ├── h8-2.png │ │ ├── h8-3.png │ │ ├── h8-4.png │ │ ├── h8-5.png │ │ ├── h8-6.png │ │ ├── h9-1.png │ │ ├── h9-2.png │ │ ├── h9-3.png │ │ ├── h9-4.png │ │ ├── h9-5.png │ │ ├── h9-6.png │ │ ├── h9-7.png │ │ ├── h9-8.png │ │ ├── h9-9.png │ │ ├── h11-1.png │ │ ├── h11-2.png │ │ ├── h11-3.png │ │ ├── h11-4.png │ │ ├── h11-5.png │ │ ├── h11-6.png │ │ ├── h11-7.png │ │ ├── h11-8.png │ │ ├── h12-1.png │ │ ├── h12-2.png │ │ ├── h12-3.png │ │ ├── h12-4.png │ │ ├── h12-5.png │ │ ├── h12-6.png │ │ ├── h13-1.png │ │ ├── h13-2.png │ │ ├── h13-3.png │ │ ├── h13-4.png │ │ ├── h13-5.png │ │ ├── h13-6.png │ │ ├── h13-7.png │ │ ├── h14-1.png │ │ ├── h14-10.png │ │ ├── h14-11.png │ │ ├── h14-12.png │ │ ├── h14-13.png │ │ ├── h14-14.png │ │ ├── h14-15.png │ │ ├── h14-2.png │ │ ├── h14-3.png │ │ ├── h14-4.png │ │ ├── h14-5.png │ │ ├── h14-6.png │ │ ├── h14-7.png │ │ ├── h14-8.png │ │ ├── h14-9.png │ │ ├── h15-1.png │ │ ├── h15-10.png │ │ ├── h15-11.png │ │ ├── h15-12.png │ │ ├── h15-13.png │ │ ├── h15-14.png │ │ ├── h15-15.png │ │ ├── h15-16.png │ │ ├── h15-17.png │ │ ├── h15-2.png │ │ ├── h15-3.png │ │ ├── h15-4.png │ │ ├── h15-5.png │ │ ├── h15-6.png │ │ ├── h15-7.png │ │ ├── h15-8.png │ │ ├── h15-9.png │ │ ├── h16-1.png │ │ ├── h16-2.png │ │ ├── h16-3.png │ │ ├── h16-4.png │ │ ├── h16-5.png │ │ ├── h16-6.png │ │ ├── h16-7.png │ │ ├── h16-8.png │ │ ├── h16-9.png │ │ ├── h17-1.png │ │ ├── h17-2.png │ │ ├── h17-3.png │ │ ├── h17-4.png │ │ ├── h17-5.png │ │ ├── h18-1.png │ │ ├── h18-2.png │ │ ├── h18-3.png │ │ ├── h18-4.png │ │ ├── h18-5.png │ │ ├── h20-1.png │ │ ├── h20-10.png │ │ ├── h20-11.png │ │ ├── h20-12.png │ │ ├── h20-13.png │ │ ├── h20-14.png │ │ ├── h20-15.png │ │ ├── h20-16.png │ │ ├── h20-17.png │ │ ├── h20-2.png │ │ ├── h20-3.png │ │ ├── h20-4.png │ │ ├── h20-5.png │ │ ├── h20-6.png │ │ ├── h20-7.png │ │ ├── h20-8.png │ │ ├── h20-9.png │ │ ├── h21-1.png │ │ ├── h21-2.png │ │ ├── h21-3.png │ │ ├── h21-4.png │ │ ├── h22-1.png │ │ ├── h22-10.png │ │ ├── h22-11.png │ │ ├── h22-12.png │ │ ├── h22-13.png │ │ ├── h22-14.png │ │ ├── h22-15.png │ │ ├── h22-16.png │ │ ├── h22-17.png │ │ ├── h22-18.png │ │ ├── h22-19.png │ │ ├── h22-2.png │ │ ├── h22-20.png │ │ ├── h22-21.png │ │ ├── h22-22.png │ │ ├── h22-23.png │ │ ├── h22-24.png │ │ ├── h22-25.png │ │ ├── h22-26.png │ │ ├── h22-27.png │ │ ├── h22-28.png │ │ ├── h22-29.png │ │ ├── h22-3.png │ │ ├── h22-30.png │ │ ├── h22-4.png │ │ ├── h22-5.png │ │ ├── h22-6.png │ │ ├── h22-7.png │ │ ├── h22-8.png │ │ ├── h22-9.png │ │ ├── h3-10.png │ │ ├── h3-11.png │ │ ├── h3-12.png │ │ ├── h3-13.png │ │ ├── h3-14.png │ │ ├── h3-15.png │ │ ├── h3-16.png │ │ ├── h3-17.png │ │ ├── h3-18.png │ │ ├── h3-19.png │ │ ├── h3-20.png │ │ ├── h3-21.png │ │ ├── h3-22.png │ │ ├── h3-23.png │ │ ├── h3-24.png │ │ ├── h3-25.png │ │ ├── h4-10.png │ │ ├── h4-11.png │ │ ├── h4-12.png │ │ ├── h4-13.png │ │ ├── h4-14.png │ │ ├── h6-10.png │ │ ├── h6-11.png │ │ ├── h6-12.png │ │ └── h6-13.png │ ├── http2-6.md │ ├── 21.md │ ├── README.md │ ├── 12.md │ ├── http2-3.md │ ├── 8.md │ ├── 17.md │ ├── 18.md │ ├── 1.md │ ├── 13.md │ ├── 11.md │ ├── 20.md │ ├── 2.md │ ├── 9.md │ ├── http2-5.md │ ├── 14.md │ ├── 16.md │ ├── 3.md │ ├── 6.md │ ├── 7.md │ ├── 15.md │ └── 4.md ├── udp.md ├── arp.md ├── ftp.md ├── dhcp.md ├── icmp.md ├── ppp.md ├── dns.md ├── wireshark.md ├── physical-layer.md ├── multi-media.md ├── wireless-network.md ├── internet-security.md ├── ethernet.md └── tcp.md ├── imgs ├── arp1.png ├── arp2.png ├── dhcp.png ├── ftp.png ├── ip1.png ├── ip10.png ├── ip11.png ├── ip12.png ├── ip13.png ├── ip14.png ├── ip15.png ├── ip16.png ├── ip17.png ├── ip18.png ├── ip19.png ├── ip2.png ├── ip20.png ├── ip21.png ├── ip22.png ├── ip23.png ├── ip24.png ├── ip25.png ├── ip26.png ├── ip27.png ├── ip28.png ├── ip29.png ├── ip3.png ├── ip30.png ├── ip31.png ├── ip32.png ├── ip33.png ├── ip34.png ├── ip35.png ├── ip36.png ├── ip37.png ├── ip38.png ├── ip39.png ├── ip4.png ├── ip40.png ├── ip41.png ├── ip42.png ├── ip5.png ├── ip6.png ├── ip7.png ├── ip8.png ├── ip9.png ├── is1.png ├── is10.png ├── is11.png ├── is12.png ├── is13.png ├── is14.png ├── is15.png ├── is2.png ├── is3.png ├── is4.png ├── is5.png ├── is6.png ├── is7.png ├── is8.png ├── is9.png ├── ll1.png ├── ll10.png ├── ll2.png ├── ll3.png ├── ll4.png ├── ll5.png ├── ll6.png ├── ll7.png ├── ll8.png ├── ll9.png ├── mm1.png ├── mm10.png ├── mm11.png ├── mm12.png ├── mm13.png ├── mm14.png ├── mm15.png ├── mm16.png ├── mm17.png ├── mm18.png ├── mm19.png ├── mm2.png ├── mm20.png ├── mm21.png ├── mm22.png ├── mm23.png ├── mm3.png ├── mm4.png ├── mm5.png ├── mm6.png ├── mm7.png ├── mm8.png ├── mm9.png ├── pl1.png ├── pl10.png ├── pl11.png ├── pl12.png ├── pl13.png ├── pl14.png ├── pl15.png ├── pl2.png ├── pl3.png ├── pl4.png ├── pl5.png ├── pl6.png ├── pl7.png ├── pl8.png ├── pl9.png ├── ppp1.png ├── ppp2.png ├── ppp3.png ├── ppp4.png ├── ppp5.png ├── ppp6.png ├── tcp.png ├── udp.jpg ├── wn1.png ├── wn10.png ├── wn11.png ├── wn12.png ├── wn13.png ├── wn14.png ├── wn15.png ├── wn16.png ├── wn17.png ├── wn18.png ├── wn2.png ├── wn3.png ├── wn4.png ├── wn5.png ├── wn6.png ├── wn7.png ├── wn8.png ├── wn9.png ├── dhcp2.png ├── dhcp3.png ├── icmp1.png ├── icmp2.png ├── icmp3.png ├── dns-space.png ├── recBuffer.png ├── dns-example.png ├── dns-server.png ├── sendwindow.jpg ├── dns-name-format.png └── dns-protocol-format.png ├── codes ├── socket1-webserver │ ├── HelloWorld.html │ ├── client2.js │ ├── server.js │ ├── server2.js │ ├── README.md │ └── index.html ├── socket2-udpping │ ├── server.js │ ├── README.md │ └── client.js ├── socket3-email │ ├── README.md │ └── client.js └── socket4-proxyserver │ ├── README.md │ └── server.js ├── lab-udp.md ├── lab-tcp.md ├── lab-ip.md ├── package.json ├── lab-dhcp.md ├── lab-nat.md ├── lab-wireless.md ├── lab-ethernet.md ├── lab-Introduction.md ├── lab-ssl.md ├── lab-http.md ├── README.md └── lab-dns.md /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ -------------------------------------------------------------------------------- /docs/http/5.md: -------------------------------------------------------------------------------- 1 | # Web 服务器 2 | ![](imgs/h5-1.png) -------------------------------------------------------------------------------- /imgs/arp1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/arp1.png -------------------------------------------------------------------------------- /imgs/arp2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/arp2.png -------------------------------------------------------------------------------- /imgs/dhcp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/dhcp.png -------------------------------------------------------------------------------- /imgs/ftp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ftp.png -------------------------------------------------------------------------------- /imgs/ip1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip1.png -------------------------------------------------------------------------------- /imgs/ip10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip10.png -------------------------------------------------------------------------------- /imgs/ip11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip11.png -------------------------------------------------------------------------------- /imgs/ip12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip12.png -------------------------------------------------------------------------------- /imgs/ip13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip13.png -------------------------------------------------------------------------------- /imgs/ip14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip14.png -------------------------------------------------------------------------------- /imgs/ip15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip15.png -------------------------------------------------------------------------------- /imgs/ip16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip16.png -------------------------------------------------------------------------------- /imgs/ip17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip17.png -------------------------------------------------------------------------------- /imgs/ip18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip18.png -------------------------------------------------------------------------------- /imgs/ip19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip19.png -------------------------------------------------------------------------------- /imgs/ip2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip2.png -------------------------------------------------------------------------------- /imgs/ip20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip20.png -------------------------------------------------------------------------------- /imgs/ip21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip21.png -------------------------------------------------------------------------------- /imgs/ip22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip22.png -------------------------------------------------------------------------------- /imgs/ip23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip23.png -------------------------------------------------------------------------------- /imgs/ip24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip24.png -------------------------------------------------------------------------------- /imgs/ip25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip25.png -------------------------------------------------------------------------------- /imgs/ip26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip26.png -------------------------------------------------------------------------------- /imgs/ip27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip27.png -------------------------------------------------------------------------------- /imgs/ip28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip28.png -------------------------------------------------------------------------------- /imgs/ip29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip29.png -------------------------------------------------------------------------------- /imgs/ip3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip3.png -------------------------------------------------------------------------------- /imgs/ip30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip30.png -------------------------------------------------------------------------------- /imgs/ip31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip31.png -------------------------------------------------------------------------------- /imgs/ip32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip32.png -------------------------------------------------------------------------------- /imgs/ip33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip33.png -------------------------------------------------------------------------------- /imgs/ip34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip34.png -------------------------------------------------------------------------------- /imgs/ip35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip35.png -------------------------------------------------------------------------------- /imgs/ip36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip36.png -------------------------------------------------------------------------------- /imgs/ip37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip37.png -------------------------------------------------------------------------------- /imgs/ip38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip38.png -------------------------------------------------------------------------------- /imgs/ip39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip39.png -------------------------------------------------------------------------------- /imgs/ip4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip4.png -------------------------------------------------------------------------------- /imgs/ip40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip40.png -------------------------------------------------------------------------------- /imgs/ip41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip41.png -------------------------------------------------------------------------------- /imgs/ip42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip42.png -------------------------------------------------------------------------------- /imgs/ip5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip5.png -------------------------------------------------------------------------------- /imgs/ip6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip6.png -------------------------------------------------------------------------------- /imgs/ip7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip7.png -------------------------------------------------------------------------------- /imgs/ip8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip8.png -------------------------------------------------------------------------------- /imgs/ip9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ip9.png -------------------------------------------------------------------------------- /imgs/is1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/is1.png -------------------------------------------------------------------------------- /imgs/is10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/is10.png -------------------------------------------------------------------------------- /imgs/is11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/is11.png -------------------------------------------------------------------------------- /imgs/is12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/is12.png -------------------------------------------------------------------------------- /imgs/is13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/is13.png -------------------------------------------------------------------------------- /imgs/is14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/is14.png -------------------------------------------------------------------------------- /imgs/is15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/is15.png -------------------------------------------------------------------------------- /imgs/is2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/is2.png -------------------------------------------------------------------------------- /imgs/is3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/is3.png -------------------------------------------------------------------------------- /imgs/is4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/is4.png -------------------------------------------------------------------------------- /imgs/is5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/is5.png -------------------------------------------------------------------------------- /imgs/is6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/is6.png -------------------------------------------------------------------------------- /imgs/is7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/is7.png -------------------------------------------------------------------------------- /imgs/is8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/is8.png -------------------------------------------------------------------------------- /imgs/is9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/is9.png -------------------------------------------------------------------------------- /imgs/ll1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ll1.png -------------------------------------------------------------------------------- /imgs/ll10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ll10.png -------------------------------------------------------------------------------- /imgs/ll2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ll2.png -------------------------------------------------------------------------------- /imgs/ll3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ll3.png -------------------------------------------------------------------------------- /imgs/ll4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ll4.png -------------------------------------------------------------------------------- /imgs/ll5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ll5.png -------------------------------------------------------------------------------- /imgs/ll6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ll6.png -------------------------------------------------------------------------------- /imgs/ll7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ll7.png -------------------------------------------------------------------------------- /imgs/ll8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ll8.png -------------------------------------------------------------------------------- /imgs/ll9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ll9.png -------------------------------------------------------------------------------- /imgs/mm1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/mm1.png -------------------------------------------------------------------------------- /imgs/mm10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/mm10.png -------------------------------------------------------------------------------- /imgs/mm11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/mm11.png -------------------------------------------------------------------------------- /imgs/mm12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/mm12.png -------------------------------------------------------------------------------- /imgs/mm13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/mm13.png -------------------------------------------------------------------------------- /imgs/mm14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/mm14.png -------------------------------------------------------------------------------- /imgs/mm15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/mm15.png -------------------------------------------------------------------------------- /imgs/mm16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/mm16.png -------------------------------------------------------------------------------- /imgs/mm17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/mm17.png -------------------------------------------------------------------------------- /imgs/mm18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/mm18.png -------------------------------------------------------------------------------- /imgs/mm19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/mm19.png -------------------------------------------------------------------------------- /imgs/mm2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/mm2.png -------------------------------------------------------------------------------- /imgs/mm20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/mm20.png -------------------------------------------------------------------------------- /imgs/mm21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/mm21.png -------------------------------------------------------------------------------- /imgs/mm22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/mm22.png -------------------------------------------------------------------------------- /imgs/mm23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/mm23.png -------------------------------------------------------------------------------- /imgs/mm3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/mm3.png -------------------------------------------------------------------------------- /imgs/mm4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/mm4.png -------------------------------------------------------------------------------- /imgs/mm5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/mm5.png -------------------------------------------------------------------------------- /imgs/mm6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/mm6.png -------------------------------------------------------------------------------- /imgs/mm7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/mm7.png -------------------------------------------------------------------------------- /imgs/mm8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/mm8.png -------------------------------------------------------------------------------- /imgs/mm9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/mm9.png -------------------------------------------------------------------------------- /imgs/pl1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/pl1.png -------------------------------------------------------------------------------- /imgs/pl10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/pl10.png -------------------------------------------------------------------------------- /imgs/pl11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/pl11.png -------------------------------------------------------------------------------- /imgs/pl12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/pl12.png -------------------------------------------------------------------------------- /imgs/pl13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/pl13.png -------------------------------------------------------------------------------- /imgs/pl14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/pl14.png -------------------------------------------------------------------------------- /imgs/pl15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/pl15.png -------------------------------------------------------------------------------- /imgs/pl2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/pl2.png -------------------------------------------------------------------------------- /imgs/pl3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/pl3.png -------------------------------------------------------------------------------- /imgs/pl4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/pl4.png -------------------------------------------------------------------------------- /imgs/pl5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/pl5.png -------------------------------------------------------------------------------- /imgs/pl6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/pl6.png -------------------------------------------------------------------------------- /imgs/pl7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/pl7.png -------------------------------------------------------------------------------- /imgs/pl8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/pl8.png -------------------------------------------------------------------------------- /imgs/pl9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/pl9.png -------------------------------------------------------------------------------- /imgs/ppp1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ppp1.png -------------------------------------------------------------------------------- /imgs/ppp2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ppp2.png -------------------------------------------------------------------------------- /imgs/ppp3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ppp3.png -------------------------------------------------------------------------------- /imgs/ppp4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ppp4.png -------------------------------------------------------------------------------- /imgs/ppp5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ppp5.png -------------------------------------------------------------------------------- /imgs/ppp6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/ppp6.png -------------------------------------------------------------------------------- /imgs/tcp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/tcp.png -------------------------------------------------------------------------------- /imgs/udp.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/udp.jpg -------------------------------------------------------------------------------- /imgs/wn1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/wn1.png -------------------------------------------------------------------------------- /imgs/wn10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/wn10.png -------------------------------------------------------------------------------- /imgs/wn11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/wn11.png -------------------------------------------------------------------------------- /imgs/wn12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/wn12.png -------------------------------------------------------------------------------- /imgs/wn13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/wn13.png -------------------------------------------------------------------------------- /imgs/wn14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/wn14.png -------------------------------------------------------------------------------- /imgs/wn15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/wn15.png -------------------------------------------------------------------------------- /imgs/wn16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/wn16.png -------------------------------------------------------------------------------- /imgs/wn17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/wn17.png -------------------------------------------------------------------------------- /imgs/wn18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/wn18.png -------------------------------------------------------------------------------- /imgs/wn2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/wn2.png -------------------------------------------------------------------------------- /imgs/wn3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/wn3.png -------------------------------------------------------------------------------- /imgs/wn4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/wn4.png -------------------------------------------------------------------------------- /imgs/wn5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/wn5.png -------------------------------------------------------------------------------- /imgs/wn6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/wn6.png -------------------------------------------------------------------------------- /imgs/wn7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/wn7.png -------------------------------------------------------------------------------- /imgs/wn8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/wn8.png -------------------------------------------------------------------------------- /imgs/wn9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/wn9.png -------------------------------------------------------------------------------- /imgs/dhcp2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/dhcp2.png -------------------------------------------------------------------------------- /imgs/dhcp3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/dhcp3.png -------------------------------------------------------------------------------- /imgs/icmp1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/icmp1.png -------------------------------------------------------------------------------- /imgs/icmp2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/icmp2.png -------------------------------------------------------------------------------- /imgs/icmp3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/icmp3.png -------------------------------------------------------------------------------- /imgs/dns-space.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/dns-space.png -------------------------------------------------------------------------------- /imgs/recBuffer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/recBuffer.png -------------------------------------------------------------------------------- /imgs/dns-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/dns-example.png -------------------------------------------------------------------------------- /imgs/dns-server.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/dns-server.png -------------------------------------------------------------------------------- /imgs/sendwindow.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/sendwindow.jpg -------------------------------------------------------------------------------- /docs/http/http2-4.md: -------------------------------------------------------------------------------- 1 | # HTTP/2 迁移 2 | ## 撤销针对 HTTP/1.1 的“优化” 3 | ![](imgs/h22-5.png) 4 | 5 | ![](imgs/h22-6.png) -------------------------------------------------------------------------------- /docs/http/imgs/h1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h1-1.png -------------------------------------------------------------------------------- /docs/http/imgs/h1-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h1-2.png -------------------------------------------------------------------------------- /docs/http/imgs/h2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h2-1.png -------------------------------------------------------------------------------- /docs/http/imgs/h2-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h2-2.png -------------------------------------------------------------------------------- /docs/http/imgs/h2-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h2-3.png -------------------------------------------------------------------------------- /docs/http/imgs/h2-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h2-4.png -------------------------------------------------------------------------------- /docs/http/imgs/h3-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h3-1.png -------------------------------------------------------------------------------- /docs/http/imgs/h3-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h3-2.png -------------------------------------------------------------------------------- /docs/http/imgs/h3-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h3-3.png -------------------------------------------------------------------------------- /docs/http/imgs/h3-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h3-4.png -------------------------------------------------------------------------------- /docs/http/imgs/h3-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h3-5.png -------------------------------------------------------------------------------- /docs/http/imgs/h3-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h3-6.png -------------------------------------------------------------------------------- /docs/http/imgs/h3-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h3-7.png -------------------------------------------------------------------------------- /docs/http/imgs/h3-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h3-8.png -------------------------------------------------------------------------------- /docs/http/imgs/h3-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h3-9.png -------------------------------------------------------------------------------- /docs/http/imgs/h4-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h4-1.png -------------------------------------------------------------------------------- /docs/http/imgs/h4-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h4-2.png -------------------------------------------------------------------------------- /docs/http/imgs/h4-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h4-3.png -------------------------------------------------------------------------------- /docs/http/imgs/h4-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h4-4.png -------------------------------------------------------------------------------- /docs/http/imgs/h4-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h4-5.png -------------------------------------------------------------------------------- /docs/http/imgs/h4-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h4-6.png -------------------------------------------------------------------------------- /docs/http/imgs/h4-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h4-7.png -------------------------------------------------------------------------------- /docs/http/imgs/h4-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h4-8.png -------------------------------------------------------------------------------- /docs/http/imgs/h4-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h4-9.png -------------------------------------------------------------------------------- /docs/http/imgs/h5-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h5-1.png -------------------------------------------------------------------------------- /docs/http/imgs/h6-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h6-1.png -------------------------------------------------------------------------------- /docs/http/imgs/h6-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h6-2.png -------------------------------------------------------------------------------- /docs/http/imgs/h6-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h6-3.png -------------------------------------------------------------------------------- /docs/http/imgs/h6-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h6-4.png -------------------------------------------------------------------------------- /docs/http/imgs/h6-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h6-5.png -------------------------------------------------------------------------------- /docs/http/imgs/h6-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h6-6.png -------------------------------------------------------------------------------- /docs/http/imgs/h6-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h6-7.png -------------------------------------------------------------------------------- /docs/http/imgs/h6-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h6-8.png -------------------------------------------------------------------------------- /docs/http/imgs/h6-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h6-9.png -------------------------------------------------------------------------------- /docs/http/imgs/h7-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h7-1.png -------------------------------------------------------------------------------- /docs/http/imgs/h7-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h7-2.png -------------------------------------------------------------------------------- /docs/http/imgs/h7-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h7-3.png -------------------------------------------------------------------------------- /docs/http/imgs/h7-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h7-4.png -------------------------------------------------------------------------------- /docs/http/imgs/h7-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h7-5.png -------------------------------------------------------------------------------- /docs/http/imgs/h7-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h7-6.png -------------------------------------------------------------------------------- /docs/http/imgs/h7-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h7-7.png -------------------------------------------------------------------------------- /docs/http/imgs/h7-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h7-8.png -------------------------------------------------------------------------------- /docs/http/imgs/h8-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h8-1.png -------------------------------------------------------------------------------- /docs/http/imgs/h8-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h8-2.png -------------------------------------------------------------------------------- /docs/http/imgs/h8-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h8-3.png -------------------------------------------------------------------------------- /docs/http/imgs/h8-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h8-4.png -------------------------------------------------------------------------------- /docs/http/imgs/h8-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h8-5.png -------------------------------------------------------------------------------- /docs/http/imgs/h8-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h8-6.png -------------------------------------------------------------------------------- /docs/http/imgs/h9-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h9-1.png -------------------------------------------------------------------------------- /docs/http/imgs/h9-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h9-2.png -------------------------------------------------------------------------------- /docs/http/imgs/h9-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h9-3.png -------------------------------------------------------------------------------- /docs/http/imgs/h9-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h9-4.png -------------------------------------------------------------------------------- /docs/http/imgs/h9-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h9-5.png -------------------------------------------------------------------------------- /docs/http/imgs/h9-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h9-6.png -------------------------------------------------------------------------------- /docs/http/imgs/h9-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h9-7.png -------------------------------------------------------------------------------- /docs/http/imgs/h9-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h9-8.png -------------------------------------------------------------------------------- /docs/http/imgs/h9-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h9-9.png -------------------------------------------------------------------------------- /docs/http/imgs/h11-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h11-1.png -------------------------------------------------------------------------------- /docs/http/imgs/h11-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h11-2.png -------------------------------------------------------------------------------- /docs/http/imgs/h11-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h11-3.png -------------------------------------------------------------------------------- /docs/http/imgs/h11-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h11-4.png -------------------------------------------------------------------------------- /docs/http/imgs/h11-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h11-5.png -------------------------------------------------------------------------------- /docs/http/imgs/h11-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h11-6.png -------------------------------------------------------------------------------- /docs/http/imgs/h11-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h11-7.png -------------------------------------------------------------------------------- /docs/http/imgs/h11-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h11-8.png -------------------------------------------------------------------------------- /docs/http/imgs/h12-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h12-1.png -------------------------------------------------------------------------------- /docs/http/imgs/h12-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h12-2.png -------------------------------------------------------------------------------- /docs/http/imgs/h12-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h12-3.png -------------------------------------------------------------------------------- /docs/http/imgs/h12-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h12-4.png -------------------------------------------------------------------------------- /docs/http/imgs/h12-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h12-5.png -------------------------------------------------------------------------------- /docs/http/imgs/h12-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h12-6.png -------------------------------------------------------------------------------- /docs/http/imgs/h13-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h13-1.png -------------------------------------------------------------------------------- /docs/http/imgs/h13-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h13-2.png -------------------------------------------------------------------------------- /docs/http/imgs/h13-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h13-3.png -------------------------------------------------------------------------------- /docs/http/imgs/h13-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h13-4.png -------------------------------------------------------------------------------- /docs/http/imgs/h13-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h13-5.png -------------------------------------------------------------------------------- /docs/http/imgs/h13-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h13-6.png -------------------------------------------------------------------------------- /docs/http/imgs/h13-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h13-7.png -------------------------------------------------------------------------------- /docs/http/imgs/h14-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h14-1.png -------------------------------------------------------------------------------- /docs/http/imgs/h14-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h14-10.png -------------------------------------------------------------------------------- /docs/http/imgs/h14-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h14-11.png -------------------------------------------------------------------------------- /docs/http/imgs/h14-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h14-12.png -------------------------------------------------------------------------------- /docs/http/imgs/h14-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h14-13.png -------------------------------------------------------------------------------- /docs/http/imgs/h14-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h14-14.png -------------------------------------------------------------------------------- /docs/http/imgs/h14-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h14-15.png -------------------------------------------------------------------------------- /docs/http/imgs/h14-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h14-2.png -------------------------------------------------------------------------------- /docs/http/imgs/h14-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h14-3.png -------------------------------------------------------------------------------- /docs/http/imgs/h14-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h14-4.png -------------------------------------------------------------------------------- /docs/http/imgs/h14-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h14-5.png -------------------------------------------------------------------------------- /docs/http/imgs/h14-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h14-6.png -------------------------------------------------------------------------------- /docs/http/imgs/h14-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h14-7.png -------------------------------------------------------------------------------- /docs/http/imgs/h14-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h14-8.png -------------------------------------------------------------------------------- /docs/http/imgs/h14-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h14-9.png -------------------------------------------------------------------------------- /docs/http/imgs/h15-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h15-1.png -------------------------------------------------------------------------------- /docs/http/imgs/h15-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h15-10.png -------------------------------------------------------------------------------- /docs/http/imgs/h15-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h15-11.png -------------------------------------------------------------------------------- /docs/http/imgs/h15-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h15-12.png -------------------------------------------------------------------------------- /docs/http/imgs/h15-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h15-13.png -------------------------------------------------------------------------------- /docs/http/imgs/h15-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h15-14.png -------------------------------------------------------------------------------- /docs/http/imgs/h15-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h15-15.png -------------------------------------------------------------------------------- /docs/http/imgs/h15-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h15-16.png -------------------------------------------------------------------------------- /docs/http/imgs/h15-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h15-17.png -------------------------------------------------------------------------------- /docs/http/imgs/h15-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h15-2.png -------------------------------------------------------------------------------- /docs/http/imgs/h15-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h15-3.png -------------------------------------------------------------------------------- /docs/http/imgs/h15-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h15-4.png -------------------------------------------------------------------------------- /docs/http/imgs/h15-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h15-5.png -------------------------------------------------------------------------------- /docs/http/imgs/h15-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h15-6.png -------------------------------------------------------------------------------- /docs/http/imgs/h15-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h15-7.png -------------------------------------------------------------------------------- /docs/http/imgs/h15-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h15-8.png -------------------------------------------------------------------------------- /docs/http/imgs/h15-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h15-9.png -------------------------------------------------------------------------------- /docs/http/imgs/h16-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h16-1.png -------------------------------------------------------------------------------- /docs/http/imgs/h16-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h16-2.png -------------------------------------------------------------------------------- /docs/http/imgs/h16-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h16-3.png -------------------------------------------------------------------------------- /docs/http/imgs/h16-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h16-4.png -------------------------------------------------------------------------------- /docs/http/imgs/h16-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h16-5.png -------------------------------------------------------------------------------- /docs/http/imgs/h16-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h16-6.png -------------------------------------------------------------------------------- /docs/http/imgs/h16-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h16-7.png -------------------------------------------------------------------------------- /docs/http/imgs/h16-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h16-8.png -------------------------------------------------------------------------------- /docs/http/imgs/h16-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h16-9.png -------------------------------------------------------------------------------- /docs/http/imgs/h17-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h17-1.png -------------------------------------------------------------------------------- /docs/http/imgs/h17-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h17-2.png -------------------------------------------------------------------------------- /docs/http/imgs/h17-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h17-3.png -------------------------------------------------------------------------------- /docs/http/imgs/h17-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h17-4.png -------------------------------------------------------------------------------- /docs/http/imgs/h17-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h17-5.png -------------------------------------------------------------------------------- /docs/http/imgs/h18-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h18-1.png -------------------------------------------------------------------------------- /docs/http/imgs/h18-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h18-2.png -------------------------------------------------------------------------------- /docs/http/imgs/h18-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h18-3.png -------------------------------------------------------------------------------- /docs/http/imgs/h18-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h18-4.png -------------------------------------------------------------------------------- /docs/http/imgs/h18-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h18-5.png -------------------------------------------------------------------------------- /docs/http/imgs/h20-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h20-1.png -------------------------------------------------------------------------------- /docs/http/imgs/h20-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h20-10.png -------------------------------------------------------------------------------- /docs/http/imgs/h20-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h20-11.png -------------------------------------------------------------------------------- /docs/http/imgs/h20-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h20-12.png -------------------------------------------------------------------------------- /docs/http/imgs/h20-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h20-13.png -------------------------------------------------------------------------------- /docs/http/imgs/h20-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h20-14.png -------------------------------------------------------------------------------- /docs/http/imgs/h20-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h20-15.png -------------------------------------------------------------------------------- /docs/http/imgs/h20-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h20-16.png -------------------------------------------------------------------------------- /docs/http/imgs/h20-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h20-17.png -------------------------------------------------------------------------------- /docs/http/imgs/h20-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h20-2.png -------------------------------------------------------------------------------- /docs/http/imgs/h20-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h20-3.png -------------------------------------------------------------------------------- /docs/http/imgs/h20-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h20-4.png -------------------------------------------------------------------------------- /docs/http/imgs/h20-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h20-5.png -------------------------------------------------------------------------------- /docs/http/imgs/h20-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h20-6.png -------------------------------------------------------------------------------- /docs/http/imgs/h20-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h20-7.png -------------------------------------------------------------------------------- /docs/http/imgs/h20-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h20-8.png -------------------------------------------------------------------------------- /docs/http/imgs/h20-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h20-9.png -------------------------------------------------------------------------------- /docs/http/imgs/h21-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h21-1.png -------------------------------------------------------------------------------- /docs/http/imgs/h21-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h21-2.png -------------------------------------------------------------------------------- /docs/http/imgs/h21-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h21-3.png -------------------------------------------------------------------------------- /docs/http/imgs/h21-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h21-4.png -------------------------------------------------------------------------------- /docs/http/imgs/h22-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h22-1.png -------------------------------------------------------------------------------- /docs/http/imgs/h22-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h22-10.png -------------------------------------------------------------------------------- /docs/http/imgs/h22-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h22-11.png -------------------------------------------------------------------------------- /docs/http/imgs/h22-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h22-12.png -------------------------------------------------------------------------------- /docs/http/imgs/h22-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h22-13.png -------------------------------------------------------------------------------- /docs/http/imgs/h22-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h22-14.png -------------------------------------------------------------------------------- /docs/http/imgs/h22-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h22-15.png -------------------------------------------------------------------------------- /docs/http/imgs/h22-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h22-16.png -------------------------------------------------------------------------------- /docs/http/imgs/h22-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h22-17.png -------------------------------------------------------------------------------- /docs/http/imgs/h22-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h22-18.png -------------------------------------------------------------------------------- /docs/http/imgs/h22-19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h22-19.png -------------------------------------------------------------------------------- /docs/http/imgs/h22-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h22-2.png -------------------------------------------------------------------------------- /docs/http/imgs/h22-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h22-20.png -------------------------------------------------------------------------------- /docs/http/imgs/h22-21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h22-21.png -------------------------------------------------------------------------------- /docs/http/imgs/h22-22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h22-22.png -------------------------------------------------------------------------------- /docs/http/imgs/h22-23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h22-23.png -------------------------------------------------------------------------------- /docs/http/imgs/h22-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h22-24.png -------------------------------------------------------------------------------- /docs/http/imgs/h22-25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h22-25.png -------------------------------------------------------------------------------- /docs/http/imgs/h22-26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h22-26.png -------------------------------------------------------------------------------- /docs/http/imgs/h22-27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h22-27.png -------------------------------------------------------------------------------- /docs/http/imgs/h22-28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h22-28.png -------------------------------------------------------------------------------- /docs/http/imgs/h22-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h22-29.png -------------------------------------------------------------------------------- /docs/http/imgs/h22-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h22-3.png -------------------------------------------------------------------------------- /docs/http/imgs/h22-30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h22-30.png -------------------------------------------------------------------------------- /docs/http/imgs/h22-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h22-4.png -------------------------------------------------------------------------------- /docs/http/imgs/h22-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h22-5.png -------------------------------------------------------------------------------- /docs/http/imgs/h22-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h22-6.png -------------------------------------------------------------------------------- /docs/http/imgs/h22-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h22-7.png -------------------------------------------------------------------------------- /docs/http/imgs/h22-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h22-8.png -------------------------------------------------------------------------------- /docs/http/imgs/h22-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h22-9.png -------------------------------------------------------------------------------- /docs/http/imgs/h3-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h3-10.png -------------------------------------------------------------------------------- /docs/http/imgs/h3-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h3-11.png -------------------------------------------------------------------------------- /docs/http/imgs/h3-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h3-12.png -------------------------------------------------------------------------------- /docs/http/imgs/h3-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h3-13.png -------------------------------------------------------------------------------- /docs/http/imgs/h3-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h3-14.png -------------------------------------------------------------------------------- /docs/http/imgs/h3-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h3-15.png -------------------------------------------------------------------------------- /docs/http/imgs/h3-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h3-16.png -------------------------------------------------------------------------------- /docs/http/imgs/h3-17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h3-17.png -------------------------------------------------------------------------------- /docs/http/imgs/h3-18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h3-18.png -------------------------------------------------------------------------------- /docs/http/imgs/h3-19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h3-19.png -------------------------------------------------------------------------------- /docs/http/imgs/h3-20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h3-20.png -------------------------------------------------------------------------------- /docs/http/imgs/h3-21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h3-21.png -------------------------------------------------------------------------------- /docs/http/imgs/h3-22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h3-22.png -------------------------------------------------------------------------------- /docs/http/imgs/h3-23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h3-23.png -------------------------------------------------------------------------------- /docs/http/imgs/h3-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h3-24.png -------------------------------------------------------------------------------- /docs/http/imgs/h3-25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h3-25.png -------------------------------------------------------------------------------- /docs/http/imgs/h4-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h4-10.png -------------------------------------------------------------------------------- /docs/http/imgs/h4-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h4-11.png -------------------------------------------------------------------------------- /docs/http/imgs/h4-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h4-12.png -------------------------------------------------------------------------------- /docs/http/imgs/h4-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h4-13.png -------------------------------------------------------------------------------- /docs/http/imgs/h4-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h4-14.png -------------------------------------------------------------------------------- /docs/http/imgs/h6-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h6-10.png -------------------------------------------------------------------------------- /docs/http/imgs/h6-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h6-11.png -------------------------------------------------------------------------------- /docs/http/imgs/h6-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h6-12.png -------------------------------------------------------------------------------- /docs/http/imgs/h6-13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/docs/http/imgs/h6-13.png -------------------------------------------------------------------------------- /imgs/dns-name-format.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/dns-name-format.png -------------------------------------------------------------------------------- /imgs/dns-protocol-format.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/woai3c/Computer-Networking-Lab/HEAD/imgs/dns-protocol-format.png -------------------------------------------------------------------------------- /codes/socket1-webserver/HelloWorld.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Hello World 7 | 8 | 9 | Hello World! 10 | 11 | -------------------------------------------------------------------------------- /docs/udp.md: -------------------------------------------------------------------------------- 1 | # UDP 文档 2 | ## 特点 3 | * 无需连接建立 4 | * 无连接状态 5 | * 不可靠数据传输 6 | * 没有拥塞控制机制 7 | * 分组首部开销小(8字节) 8 | * UDP 对应用层的报文既不拆分,也不合并,一次交付一个完整的报文 9 | * 支持一对一、一对多、多对一、多对多通信 10 | 11 | ## TCP 报文段结构 12 | UDP 报文由首部字段和数据字段两部分组成。 13 | 14 | ![](https://github.com/woai3c/Computer-Networking-Lab/blob/master/imgs/udp.jpg) 15 | -------------------------------------------------------------------------------- /codes/socket1-webserver/client2.js: -------------------------------------------------------------------------------- 1 | const net = require('net') 2 | 3 | const argv = process.argv 4 | const host = argv[2] 5 | const port = argv[3] 6 | const fileName = argv[4] 7 | 8 | const client = net.createConnection(port, host, () => { 9 | console.log('已连接到服务器') 10 | client.write(fileName) 11 | }) 12 | 13 | client.on('data', data => { 14 | console.log(data.toString()) 15 | client.end() 16 | }) 17 | 18 | client.on('end', () => { 19 | console.log('已从服务器断开') 20 | }) -------------------------------------------------------------------------------- /docs/http/http2-6.md: -------------------------------------------------------------------------------- 1 | # HTTP/2 性能 2 | ## 延迟 3 | ![](imgs/h22-25.png) 4 | 5 | ![](imgs/h22-26.png) 6 | 7 | ## 丢包 8 | 如果网络中传输的数据包没有成功到达目的地,就称为丢包;这通常是网络拥堵造成的。 9 | 10 | ![](imgs/h22-27.png) 11 | 12 | ![](imgs/h22-28.png) 13 | 14 | ## 服务端推送 15 | 如果合理使用推送,页面渲染时间可以减少 20%-50%。尽管如此,推送也会浪费带宽,因为推送的资源在客户端有可能已经缓存,导致客户端收到不需要的数据。 16 | 17 | ![](imgs/h22-29.png) 18 | 19 | ## 首字节时间 20 | ![](imgs/h22-30.png) 21 | 22 | 下列是 H1 没有,但 H2 实现了的事情: 23 | 1. 窗口大小调节 24 | 2. 依赖树构建 25 | 3. 维持首都信息的静态/动态表 26 | 4. 压缩/解压缩首部 27 | 5. 优先级调整(H2 允许客户端多次调整单一请求的优先级) 28 | 6. 预先推送客户端尚未请求的数据流 -------------------------------------------------------------------------------- /codes/socket1-webserver/server.js: -------------------------------------------------------------------------------- 1 | const http = require('http') 2 | const fs = require('fs') 3 | 4 | http 5 | .createServer((req, res) => { 6 | if (req.url == '/HelloWorld.html' || req.url == '/index.html') { 7 | fs.readFile(__dirname + req.url, 'utf-8', (err, data) => { 8 | if (err) throw err 9 | res.end(data) 10 | }) 11 | } else { 12 | res 13 | .writeHead(404) 14 | .end() 15 | } 16 | }) 17 | .listen(8080, 'localhost', () => { 18 | console.log('服务器开始监听localhost:8080') 19 | }) -------------------------------------------------------------------------------- /codes/socket2-udpping/server.js: -------------------------------------------------------------------------------- 1 | const dgram = require('dgram') 2 | const server = dgram.createSocket('udp4') 3 | 4 | server.on('error', (err) => { 5 | console.log(`服务器异常:\n${ err.stack }`) 6 | server.close() 7 | }) 8 | 9 | server.on('message', (msg, rinfo) => { 10 | if (Math.random(1, 10) * 10 > 4) { 11 | server.send(msg, rinfo.port) 12 | } 13 | }) 14 | 15 | server.on('listening', () => { 16 | const address = server.address() 17 | console.log(`服务器监听 ${ address.address }:${ address.port }`) 18 | }) 19 | 20 | server.bind(8080, 'localhost') -------------------------------------------------------------------------------- /codes/socket3-email/README.md: -------------------------------------------------------------------------------- 1 | # 套接字编程作业3:邮件客户端 2 | 作业用 nodejs 编写 3 | 4 | ```js 5 | node client.js 6 | ``` 7 | 8 | ## 参考资料 9 | * 官方文档:[Socket3_SMTP.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/SocketProgrammingAssignment/作业3-邮件客户端/Socket3_SMTP.pdf) 10 | * 翻译:[作业3-邮件客户端-翻译.md](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/SocketProgrammingAssignment/作业3-邮件客户端/作业3-邮件客户端-翻译.md) 11 | * 解答:[作业3-邮件客户端-解答.md](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/SocketProgrammingAssignment/作业3-邮件客户端/作业3-邮件客户端-解答.md) 12 | -------------------------------------------------------------------------------- /docs/arp.md: -------------------------------------------------------------------------------- 1 | # ARP 地址解析协议文档 2 | ARP 根据 IP 地址找出相应的物理地址,每一台主机都有 ARP 高速缓存,里面有本局域网上各主机和路由器的 IP 地址与硬件地址的映射表,并且动态更新。 3 | ARP 只能解析同一局域网上的主机和路由器的 IP 地址与硬件地址的映射问题。 4 | 5 | ![](../imgs/arp1.png) 6 | 7 | 假设主机 A 想知道主机 B 的硬件地址,解析过程: 8 | 1. ARP 进程在本局域网广播一个 ARP 请求分组,请求内容相当于:“我的 IP 地址是 xxx,硬件地址是 yyy,我想知道 IP 地址为 zzz 的主机的硬件地址”。 9 | 2. 本局域网所有主机上运行的 ARP 进程都会收到此 ARP 请求分组。 10 | 3. 与这个请求分组要查询的 IP 地址一致的主机才会收下这个 ARP 请求分组,并向发出该请求的主机发送 ARP 响应分组(响应分组为单播),同时在分组上写入自己的硬件地址。主机 B 在这个过程中也会把主机 A 的 IP 地址与硬件地址映射关系更新到其 ARP 高速缓存。 11 | 4. 主机 A 在收到响应分组后,在其 ARP 高速缓存更新主机 B 的 IP 地址与硬件地址的映射。 12 | 13 | ARP 对高速缓存中的表项设置生存时间,凡超过生存时间的表项就会删除掉。 14 | 15 | ## ARP 报文格式 16 | ![](../imgs/arp2.png) -------------------------------------------------------------------------------- /codes/socket4-proxyserver/README.md: -------------------------------------------------------------------------------- 1 | # 套接字编程作业4:多线程Web代理服务器 2 | 作业用 nodejs 编写 3 | 4 | ```js 5 | node server.js 6 | ``` 7 | 8 | ## 参考资料 9 | - 官方文档:[Socket4_ProxyServer.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/SocketProgrammingAssignment/作业4-多线程Web代理服务器/Socket4_ProxyServer.pdf) 10 | - 翻译:[作业4-多线程Web代理服务器-翻译.md](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/SocketProgrammingAssignment/作业4-多线程Web代理服务器/作业4-多线程Web代理服务器-翻译.md) 11 | - 解答:[作业4-多线程Web代理服务器-解答.md](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/SocketProgrammingAssignment/作业4-多线程Web代理服务器/作业4-多线程Web代理服务器-解答.md) 12 | -------------------------------------------------------------------------------- /codes/socket2-udpping/README.md: -------------------------------------------------------------------------------- 1 | # 套接字编程作业2:UDPping程序 2 | 作业用 nodejs 编写 3 | 4 | 5 | 开启服务器 6 | ```js 7 | node server.js 8 | ``` 9 | 开启客户端 10 | ```js 11 | node client.js 12 | ``` 13 | 14 | ## 参考资料 15 | * 官方文档:[Socket2_UDPpinger.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/SocketProgrammingAssignment/作业2-UDPping程序/Socket2_UDPpinger.pdf) 16 | * 翻译:[作业2-UDPping程序-翻译.md](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/SocketProgrammingAssignment/作业2-UDPping程序/作业2-UDPping程序-翻译.md) 17 | * 解答:[作业2-UDPping程序-解答.md](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/SocketProgrammingAssignment/作业2-UDPping程序/作业2-UDPping程序-解答.md) 18 | -------------------------------------------------------------------------------- /docs/http/21.md: -------------------------------------------------------------------------------- 1 | # 日记记录与使用情况跟踪 2 | 通常服务器或代理会记录一个请求的以下几个字段: 3 | 1. HTTP 方法; 4 | 2. 客户端和服务器的 HTTP 版本; 5 | 3. 所请求资源的 URL; 6 | 4. 响应的 HTTP 状态码; 7 | 5. 请求和响应报文的尺寸(包含所有的实体主体部分); 8 | 6. 事务开始时的时间戳; 9 | 7. Referer 首部和 User-Agent 首部的值。 10 | 11 | ## 日志格式 12 | ### 常用日志格式 13 | 现在最常见的日志格式就是**常用日志格式**,由 NCSA 定义,很多服务器默认使用的日志格式。 14 | 15 | ![](imgs/h21-1.png) 16 | 17 | ### 组合日志格式 18 | Apache 服务器就支持这种格式,它比常用日志格式多了两个字段。 19 | 20 | ![](imgs/h21-2.png) 21 | 22 | ### 网景扩展日志格式 23 | 网景的日志格式基于常用日志格式,并对其进行了扩展。 24 | 25 | ![](imgs/h21-3.png) 26 | 27 | ### 网景扩展日志2格式 28 | 网景的扩展日志格式2基于网景扩展日志格式,并添加了一些字段。 29 | 30 | ![](imgs/h21-4.png) 31 | 32 | ## 命中率测量 33 | 命中率测量协议是对 HTTP 的一种扩展,它要求缓存周期性地向原始服务器汇报缓存访问的统计数据。 34 | 35 | 命中率测量协议提供了一些基本的功能,缓存和服务器可以实现这些功能来共享访问信息,规范已缓存资源的可使用次数。 36 | 37 | 命中率测量协议没有得到广泛的实现或应用。 -------------------------------------------------------------------------------- /docs/ftp.md: -------------------------------------------------------------------------------- 1 | # FTP 文档 2 | FTP 提供交互式访问,允许客户指定文件类型与格式。 3 | FTP 和 TFTP 是文件共享协议中的一大类,即复制整个文件。其特点是存取一个文件,就得先获得本地文件的副本;如果要修改文件,只能对副本进行修改,再传回原节点。 4 | 文件共享协议的另一大类是联机访问,即允许多个程序同时对一个文件进行存取。 5 | ## FTP 特点 6 | FTP 客户和服务器之间要建立两个并行的 TCP 连接:控制连接和数据连接。FTP 服务器控制进程使用端口 21,数据进程使用端口 20。 7 | #### 1. 基于 TCP 8 | #### 2. 使用客户服务器方式,FTP 服务器可同时为多个客户进程提供服务 9 | #### 3. FTP 服务器进程由两大部分组成:一是主进程,负责接收请求;二是有多个从属进程,负责处理单个请求。 10 | #### 4. 工作步骤: 11 | * 打开端口号 21 12 | * 等待客户进程请求 13 | * 启动从属进程处理客户请求,从属进程处理完客户请求即终止 14 | * 回到等待状态,主进程和从属进程是并行的 15 | 16 | ![](https://github.com/woai3c/Computer-Networking-Lab/blob/master/imgs/ftp.png) 17 | ## TFTP 特点 18 | #### 1. 基于 UDP 19 | #### 2. 只支持文件传输,不支持交互 20 | #### 3. 不能对用户进行身份鉴定 21 | #### 4. 代码占内存较小 22 | #### 5. 传输报文有 512 字节的数据,最后一次可不足 512 字节 23 | #### 6. 对文件进行读写 24 | #### 7. 支持 ASCII 或二进制传送 25 | #### 5. 数据报文按序编号,从 1 开始 26 | #### 6. 使用简单的首部 27 | -------------------------------------------------------------------------------- /docs/http/README.md: -------------------------------------------------------------------------------- 1 | # [HTTP 权威指南](https://book.douban.com/subject/10746113/)——学习笔记 2 | 1. [HTTP 概述](1.md) 3 | 2. [URL 与资源](2.md) 4 | 3. [HTTP 报文](3.md) 5 | 4. [连接管理](4.md) 6 | 5. [Web 服务器](5.md) 7 | 6. [代理](6.md) 8 | 7. [缓存](7.md) 9 | 8. [集成点:网关、隧道及中继](8.md) 10 | 9. [Web 机器人](9.md) 11 | 10. HTTP-NG(略) 12 | 11. [客户端识别与 cookie 机制](11.md) 13 | 12. [基本认证机制](12.md) 14 | 13. [摘要认证](13.md) 15 | 14. [安全 HTTP](14.md) 16 | 15. [实体和编码](15.md) 17 | 16. [国际化](16.md) 18 | 17. [内容协商和转码](17.md) 19 | 18. [Web 主机托管](18.md) 20 | 19. 发布系统(略) 21 | 20. [重定向与负载均衡](20.md) 22 | 21. [日记记录与使用情况跟踪](21.md) 23 | 24 | # [HTTP2基础教程](https://book.douban.com/subject/27665112/)——学习笔记 25 | 1. HTTP 进化史(略) 26 | 2. HTTP/2 快速入门(略) 27 | 3. [Web 优化“黑魔法”的动机与方式](http2-3.md) 28 | 4. [HTTP/2 迁移](http2-4.md) 29 | 5. [HTTP/2 协议](http2-5.md) 30 | 6. [HTTP/2 性能](http2-6.md) 31 | 32 | ... 略 33 | -------------------------------------------------------------------------------- /codes/socket1-webserver/server2.js: -------------------------------------------------------------------------------- 1 | const net = require('net') 2 | const fs = require('fs') 3 | 4 | net 5 | .createServer(socket => { 6 | console.log('客户端已连接') 7 | socket.on('end', () => { 8 | console.log('客户端已断开连接') 9 | }) 10 | 11 | socket.on('data', data => { 12 | const fileName = data.toString() 13 | console.log(fileName) 14 | if (fileName == 'HelloWorld.html' || fileName == 'index.html') { 15 | fs.readFile(__dirname + '/' + fileName, 'utf-8', (err, data) => { 16 | if (err) throw err 17 | socket.write(data) 18 | }) 19 | } else { 20 | socket.write('404 Not Found') 21 | } 22 | }) 23 | }) 24 | .on('error', err => { 25 | throw err 26 | }) 27 | .listen(8080, 'localhost', () => { 28 | console.log('服务器开始监听localhost:8080') 29 | }) -------------------------------------------------------------------------------- /docs/dhcp.md: -------------------------------------------------------------------------------- 1 | # DHCP 动态主机配置协议 2 | DHCP 使用客户服务器模式,报文基于 UDP。 3 | 4 | ## 连接过程 5 | 1. 服务器被动打开 UDP 端口 67,等待客户端的请求报文 6 | 2. 客户端使用 UDP 端口 68 发送请求报文 7 | 3. 需要 IP 地址的主机在启动时广播发送 DHCP 发现报文(255.255.255.255),本地网络上的主机都能收到,但只有 DHCP 服务器才会响应。 8 | 4. 收到 DHCP 发现报文的服务器都会发出 DHCP 提供报文,如果有多个 DHCP 服务器,则客户端在其中选择一个,并向所选择的服务器发送 DHCP 请求报文。 9 | 5. 被选择的 DHCP 服务器发送确认报文 DHCPACK(DHCP 服务器在数据库查找配置信息,如果找不到,则从地址池分配一个 IP 给该计算机)。从这时起,客户就可以使用分配的 IP 地址了。 10 | 6. 服务器分配的 IP 地址是临时的,租用期为多长由服务器决定,客户端也可在发送报文中提出对租金期的要求。 11 | 7. 租用期到了一半,客户端发送请求报文,要求更新租用期。如果服务器不响应此报文,则在租用期到了 87.5% 时再次发送请求要求更新租用期。 12 | 8. 如果服务器同意,客户端则获得一个新的租用期,否则要立即停用现在的 IP 地址,重新申请 IP。 13 | 9. 客户端可随时发送释放报文终止服务器所提供的租用期。 14 | 15 | ![](https://github.com/woai3c/Computer-Networking-Lab/blob/master/imgs/dhcp.png) 16 | 17 | ![](https://github.com/woai3c/Computer-Networking-Lab/blob/master/imgs/dhcp2.png) 18 | 19 | ## DHCP 报文格式 20 | ![](https://github.com/woai3c/Computer-Networking-Lab/blob/master/imgs/dhcp3.png) 21 | -------------------------------------------------------------------------------- /lab-udp.md: -------------------------------------------------------------------------------- 1 | # Wireshark实验:探究UDP (Page201) 2 | 1. source port, destination port, checksum, length 3 | 2. 8 4 | 3. udp 数据包长度 5 | 4. 65536 6 | 5. 65535 7 | 6. 17 8 | 9 | ## 参考资料 10 | * 官方文档第六版:[Wireshark_UDP_v6.1.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-UDP/Wireshark_UDP_v6.1.pdf) 11 | * 官方文档第七版:[Wireshark_UDP_v7.0.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-UDP/Wireshark_UDP_v7.0.pdf) 12 | * 翻译:[UDP(Simplied_Chinese).pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-UDP/UDP(Simplied_Chinese).pdf) ( [CHN-STUDENT](https://github.com/chn-student) ) 13 | * 解答:[计算机网络实验-UDP.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-UDP/计算机网络实验-UDP.pdf)( [CHN-STUDENT](https://github.com/chn-student) ) -------------------------------------------------------------------------------- /docs/http/12.md: -------------------------------------------------------------------------------- 1 | # 基本认证机制 2 | ## 认证 3 | HTTP 提供了一个原生的质询/响应框架,用于用户的认证过程。 4 | 5 | ![](imgs/h12-1.png) 6 | 7 | ### 认证协议与首部 8 | HTTP 通过一组可定制的控制首部,为不同的认证协议提供了一个可扩展框架。 9 | HTTP 定义了两个官方的认证协议:基本认证和摘要认证。 10 | 11 | ![](imgs/h12-2.png) 12 | 13 | ![](imgs/h12-3.png) 14 | 15 | ### 安全域 16 | www-Authenticate 质询中包含了一个 realm 指令,它可以为用户指定不同的安全域。 17 | 18 | ![](imgs/h12-4.png) 19 | 20 | ## 基本认证 21 | 基本认证是最流行的 HTTP 认证协议。 22 | 在基本认证中,服务器可以拒绝一个事务,质询客户端,请用户提供有效的用户名和密码。服务器会返回 401 状态码来初始化认证质询,并用 www-Authenticate 响应首部指定要访问的安全域。浏览器收到质询时,会打开一个对话框,请求用户输入这个域的用户名和密码。然后将用户名和密码稍加扰码,再用 Authorization 请求首部回送给服务器。 23 | 24 | ### Base-64 用户名/密码编码 25 | HTTP 基本认证将用户名和密码打包在一起,并用 base64 编码方式对其进行编码。 26 | 27 | ![](imgs/h12-5.png) 28 | 29 | ### 代理认证 30 | 代理认证的步骤与 Web 服务器身份验证的步骤相同。但首部和状态码有所不同。 31 | 32 | ![](imgs/h12-6.png) 33 | 34 | ## 基本认证的安全缺陷 35 | 1. 虽然基本认证通过明文 BASE64 的编码方式发送,但是这很容易破解。 36 | 2. 即使采用更难解码的方式加密,第三方用户仍然能捕获用户名和密码,并将修改过的用户名和密码不停地重放给服务器。 37 | 3. 基本认证没有提供任何针对代理和中间人节点的防护措施。 38 | 4. 假冒服务器很容易骗过基本认证。 -------------------------------------------------------------------------------- /codes/socket1-webserver/README.md: -------------------------------------------------------------------------------- 1 | # 套接字编程作业1:Web服务器 2 | 作业用 nodejs 编写 3 | 4 | #### 第一部分 5 | 开启服务器 6 | ```js 7 | node server.js 8 | ``` 9 | 打开浏览器访问 `localhost:8080/index.html` 或者 `localhost:8080/HelloWorld.html` 10 | 11 | #### 第二部分 12 | 开启服务器 13 | ```js 14 | node server2.js 15 | ``` 16 | 再用 `client2.js` 访问服务器 17 | ```js 18 | node client2.js localhost 8080 index.html 19 | // or 20 | // node client2.js localhost 8080 HelloWorld.html 21 | ``` 22 | 23 | ## 参考资料 24 | * 官方文档:[Socket1_WebServer.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/SocketProgrammingAssignment/作业1-Web服务器/Socket1_WebServer.pdf) 25 | * 翻译:[作业1-Web服务器-翻译.md](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/SocketProgrammingAssignment/作业1-Web服务器/作业1-Web服务器-翻译.md) 26 | * 解答:[作业1-Web服务器-解答.md](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/SocketProgrammingAssignment/作业1-Web服务器/作业1-Web服务器-解答.md) 27 | -------------------------------------------------------------------------------- /codes/socket3-email/client.js: -------------------------------------------------------------------------------- 1 | const nodemailer = require('nodemailer') 2 | 3 | const transporter = nodemailer.createTransport({ 4 | service: 'qq', 5 | port: 465, // SMTP 端口 6 | secureConnection: true, // 使用了 SSL 7 | auth: { 8 | user: 'xxx@qq.com', 9 | // 这里密码不是qq密码,是你设置的smtp授权码 10 | pass: 'xxxx', 11 | } 12 | }) 13 | 14 | const mailOptions = { 15 | from: 'xxx@qq.com', // sender address 16 | to: 'xxx@qq.com', // list of receivers 17 | subject: 'Hello', // Subject line 18 | // 发送text或者html格式 19 | // text: 'Hello world?', // plain text body 20 | html: 'Hello world?
' // html body 21 | } 22 | 23 | // send mail with defined transport object 24 | transporter.sendMail(mailOptions, (err, info) => { 25 | if (err) throw err 26 | console.log('Message sent: %s', info.messageId) 27 | }) -------------------------------------------------------------------------------- /docs/http/http2-3.md: -------------------------------------------------------------------------------- 1 | # Web 优化“黑魔法”的动机与方式 2 | ## 当前的性能挑战 3 | 浏览器请求页面过程分为两部分:资源获取、页面解析/渲染 4 | 5 | 资源获取 6 | 7 | ![](imgs/h22-1.png) 8 | 9 | 页面解析/渲染 10 | 11 | ![](imgs/h22-2.png) 12 | 13 | 大部分浏览器对同一域名限制最多并发 TCP 连接数为 6~8 个。 14 | 15 | ### 关键性能指标 16 | 1. 延迟。延迟是指 IP 数据包从一个网络端点到另一个网络端点所花费的时间。与之相对的是往返时延 RTT,它是延迟的两倍时间。 17 | 2. 带宽。 18 | 3. DNS查询。 19 | 4. 建立连接时间。 20 | 5. TLS 协商。 21 | 6. 首字节时间(TTFB)。指从客户端开始定位到 Web 页面,至接收到主体页面响应的第一字节所耗费的时间。它包含了之前提到的各种耗时,和服务器处理时间。对于主体页面上的资源,TTFB 是指从浏览器发起请求至其收到第一字节之间的耗时。 22 | 7. 内容下载时间。 23 | 8. 开始渲染时间。客户端的屏幕上什么时候开始显示内容?这个指标测量的是用户看到空白页面的时长。 24 | 9. 文档加载完成时间(又叫页面加载时间)。这是浏览器认为页面加载完毕的时间。 25 | 26 | ### HTTP/1 的问题 27 | 1. 队头阻塞。H1 有个管道化特性,允许一次发送一组请求,但只能按发送顺序依次接收响应。在请求应答过程中,如果出现任何状况,剩下的所有请求都会被阻塞在那次请求应答之后,这就叫**队头阻塞**。 28 | 2. 慢启动机制导致的低效的 TCP 利用。 29 | 3. 臃肿的消息首部。H1 只能压缩消息内容,而不能压缩首部。如果首部算上 cookie,有几千个字节都很正常。 30 | 4. 受限的优先级设置。 31 | 5. 第三方资源。 32 | 33 | ## Web 性能优化技术 34 | ### 反模式 35 | HTTP/2 对每个域名只会开启一个连接,所以以下 HTTP/1.1 的一些做法对它来说只会适得其反。 36 | 37 | ![](imgs/h22-3.png) 38 | 39 | ![](imgs/h22-4.png) 40 | 41 | ![](imgs/h22-5.png) 42 | -------------------------------------------------------------------------------- /lab-tcp.md: -------------------------------------------------------------------------------- 1 | # Wireshark实验:探究TCP (Page200) 2 | 1. 192.168.0.118 10060 3 | 2. 128.119.245.12 80 4 | 3. 同1 5 | 4. SYN 为 1,用于连接建立 6 | 5. 0,1,通过序号,代表服务器收到我的连接并确认 syn-ack,握手第二步 7 | 6. 152417 8 | 9. 8192,会 9 | 10. 没有,查看是否有相同序号的 TCP 包 10 | 11. 1 个 MSS 的数据,可以 11 | 12 | ## 参考资料 13 | * 官方文档第六版:[Wireshark_TCP_v6.01.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-TCP/Wireshark_TCP_v6.0.pdf) 14 | * 官方文档第七版:[Wireshark_TCP_v7.0.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-TCP/Wireshark_TCP_v7.0.pdf) 15 | * 翻译:[Wireshark_TCP_v7.0_Simplified_Chinese.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-TCP/Wireshark_TCP_v7.0_Simplified_Chinese.pdf) 贡献者:CHN-STUDENT 的老师 16 | * 解答:[计算机网络实验-TCP.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-TCP/计算机网络实验-TCP.pdf)( [CHN-STUDENT](https://github.com/chn-student) ) -------------------------------------------------------------------------------- /lab-ip.md: -------------------------------------------------------------------------------- 1 | # Wireshark实验:探究IP (Page288) 2 | 1. 192.168.0.118 3 | 2. 1 4 | 3. 20, 72, 总长度 92 - 首部长度 20 5 | 4. 没有,标志位第 1 位为 0,表示后面没有分片,而且这个请求是第一个包,说明没有分片。 6 | 5. 标识位和序号一直在变。 7 | 6. 头部长度、总长度、协议、目的地址... 不变;协议、目的地址必须不变;TTL 必须更改。 8 | 7. 一直在变,无法描述。 9 | 8. 0xe896, 64。 10 | 9. 只有 TTL 不变,ID 由于计数器的原因,每次都会自增 1。 11 | 12 | ## 参考资料 13 | * 官方文档第六版:[Wireshark_IP_v6.0.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-IP/Wireshark_IP_v6.0.pdf) 14 | * 官方文档第七版:[Wireshark_IP_v7.0.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-IP/Wireshark_IP_v7.0.pdf) 15 | * 翻译:[Wireshark_IP_v7.0_Simplified_Chinese.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-IP/Wireshark_IP_v7.0_Simplied_Chinese.pdf) 贡献者:CHN-STUDENT 的老师 16 | * 解答:[计算机网络实验-IP.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-IP/计算机网络实验-IP.pdf)( [CHN-STUDENT](https://github.com/chn-student) ) 17 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Computer-Networking-Lab", 3 | "version": "1.0.0", 4 | "description": "* [Wireshark](https://github.com/woai3c/Computer-Networking-Lab/blob/master/docs/wireshark.md)\r ## 实验\r * [Wireshark实验:入门 (Page52)](https://github.com/woai3c/Computer-Networking-Lab/blob/master/lab-Introduction.md)\r * [Wireshark实验:HTTP (Page121)](https://github.com/woai3c/Computer-Networking-Lab/blob/master/lab-http.md)\r * [Wireshark实验:DNS (Page121)](https://github.com/woai3c/Computer-Networking-Lab/blob/master/lab-dns.md)", 5 | "main": "index.js", 6 | "directories": { 7 | "doc": "docs" 8 | }, 9 | "dependencies": { 10 | "nodemailer": "^6.4.16" 11 | }, 12 | "devDependencies": {}, 13 | "scripts": { 14 | "test": "echo \"Error: no test specified\" && exit 1" 15 | }, 16 | "repository": { 17 | "type": "git", 18 | "url": "git+https://github.com/woai3c/Computer-Networking-Lab.git" 19 | }, 20 | "keywords": [], 21 | "author": "", 22 | "license": "ISC", 23 | "bugs": { 24 | "url": "https://github.com/woai3c/Computer-Networking-Lab/issues" 25 | }, 26 | "homepage": "https://github.com/woai3c/Computer-Networking-Lab#readme" 27 | } 28 | -------------------------------------------------------------------------------- /docs/http/8.md: -------------------------------------------------------------------------------- 1 | # 集成点:网关、隧道及中继 2 | ## 网关 3 | 网关顾名思义就是连接两个网络的设备。有些网关有翻译器的作用,可以将一种协议转换成另一种协议。 4 | 5 | Web 网关在一侧使用 HTTP 协议,在另一侧使用另一种协议。网关可以这样进行描述: 6 | ``` 7 | <客户端协议>/<服务器协议> 8 | ``` 9 | ## 协议网关 10 | ![](imgs/h8-1.png) 11 | 12 | ### HTTP/*:服务器端 Web 网关 13 | 请求流入服务器时,服务器 Web 网关会将客户端 HTTP 请求转换为其他协议。 14 | 15 | ![](imgs/h8-2.png) 16 | 17 | ## 资源网关 18 | 最常见的网关是应用程序服务器,它将目标服务器和网关结合在一起。应用程序服务器和客户端通过 HTTP 通信,并与服务器端的应用程序相连。 19 | 20 | ![](imgs/h8-3.png) 21 | 22 | ![](imgs/h8-4.png) 23 | 24 | ## 隧道 25 | Web 隧道允许用户通过 HTTP 连接发送非 HTTP 流量,这样就可以在 HTTP 上捎带其他协议数据了。 26 | 使用 Web 隧道最常见的原因就是要在 HTTP 连接中嵌入非 HTTP 流量,这样,这类流量就可以穿过只允许 Web 流量通过的防火墙了。 27 | 28 | ### 用 CONNECT 建立 HTTP 隧道 29 | CONNECT 方法请求隧道网关创建一条到达任意目的服务器和端口的 TCP 连接,并对后继数据进行盲转发。 30 | 31 | ![](imgs/h8-5.png) 32 | 33 | #### CONNECT 请求 34 | 除了起始行之外,CONNECT 的语法和其他 HTTP 方法类似。主机和端口都必须指定: 35 | ``` 36 | CONNECT home.netscape.com:443 HTTP/1.0 37 | User-agent: Mozilla/4.0 38 | ``` 39 | 起始行之后,有零或多个 HTTP 请求首部字段,同样以 CRLF 结尾,首部列表以一个空的 CRLF 结束。 40 | 41 | #### CONNECT 响应 42 | 响应码 200 代表成功。响应中的原因短语通常被设置为 "Connection Established": 43 | ``` 44 | HTTP/1.0 200 Connection Established 45 | Proxy-agent: Netscape-Proxy/1.1 46 | ``` 47 | 这个响应不需要包含 Content-Type 首部。此时连接只是对原始字节进行转接,不再是报文的承载者,所以不需要使用内容类型。 48 | 49 | ### SSL 隧道 50 | ![](imgs/h8-6.png) -------------------------------------------------------------------------------- /codes/socket2-udpping/client.js: -------------------------------------------------------------------------------- 1 | const dgram = require('dgram') 2 | const client = dgram.createSocket('udp4') 3 | const TIMES = 10 4 | let time = 0 5 | let timer = null 6 | 7 | client.on('error', (err) => { 8 | console.log(`客户端异常:\n${ err.stack }`) 9 | client.close() 10 | }) 11 | 12 | const rtts = [] 13 | client.on('message', msg => { 14 | clearTimeout(timer) 15 | const rtt = new Date() - msg.toString().split(' ').pop() 16 | rtts.push(rtt) 17 | console.log(`RTT: ${ rtt } ms`) 18 | ping() 19 | }) 20 | 21 | ping() 22 | 23 | function calculateRTT(data) { 24 | let sum = 0 25 | data.forEach(rtt => { 26 | sum += rtt 27 | }) 28 | 29 | console.log(`平均 RTT: ${ sum / data.length } ms`) 30 | console.log(`最大 RTT: ${ Math.max(...data) } ms`) 31 | console.log(`最小 RTT: ${ Math.min(...data) } ms`) 32 | console.log(`丢包率: ${ (TIMES - data.length) / TIMES * 100 }%`) 33 | client.close() 34 | } 35 | 36 | function isTimeout() { 37 | timer = setTimeout(() => { 38 | console.log('请求超时') 39 | ping() 40 | }, 1000) 41 | } 42 | 43 | function ping() { 44 | if (++time <= TIMES) { 45 | client.send(`ping ${ time } ${ new Date().getTime() }`, 8080) 46 | isTimeout() 47 | } else { 48 | calculateRTT(rtts) 49 | } 50 | } -------------------------------------------------------------------------------- /docs/http/17.md: -------------------------------------------------------------------------------- 1 | # 内容协商和转码 2 | ## 内容协商技术 3 | 共有 3 种不同的方法可以决定服务器上哪个页面最适合客户端。 4 | 5 | ![](imgs/h17-1.png) 6 | 7 | ## 客户端驱动的协商 8 | 这种方法客户端需要发送两次请求:第一次获取列表,第二次获取选择的副本。 9 | 10 | ![](imgs/h17-2.png) 11 | 12 | ## 服务器驱动的协商 13 | 有两种机制可供服务器评估发送什么响应给客户端: 14 | 1. 检查内容协商首部集。服务器查看客户端发送的 Accept 首部集,设法用相应的响应首部与之匹配。 15 | 2. 根据其他首部进行变通。例如,服务器可以根据客户端发送的 User-Agent 首部来发送响应。 16 | 17 | ### 内容协商首部集 18 | 客户端可以用下表中列出的 HTTP 首部集发送用户的偏好信息。 19 | 20 | ![](imgs/h17-3.png) 21 | 22 | ![](imgs/h17-4.png) 23 | 24 | ### 内容协商首部中的质量值 25 | HTTP 协议中定义了质量值,允许客户端提供多个选项,并为选项关联一个优先次序。质量值 q 的范围按从低到高的值是 0.0~1.0。 26 | ``` 27 | Accept-Language: en;q=0.5, fr;q=0.0, nl;q=1.0, tr;q=0.0 28 | ``` 29 | 从上面的代码可以看出,nl 的优先级最高。 30 | 31 | ### 随其他首部集而变化 32 | 服务器可以根据其他请求首部集来匹配响应,例如 User-Agent 首部。 33 | 34 | ## 透明协商 35 | 透明协商机制用中间代理来代表客户端与服务器协商。HTTP/1.1 规范中没有定义任何透明协商机制,但定义了 Vary 首部。服务器可以在响应中发送 Vary 首部,告知中间节点需要使用哪些请求首部进行内容协商。 36 | 37 | HTTP 的 Vary 响应首部中列出了所有客户端请求首部,服务器可以用这些首部来选择文档或产生定制的内容。例如,若所提供的文档取决于 User-Agent 首部,Vary 首部就必须包含 User-Agent。 38 | 39 | ## 转码 40 | 如果服务器没有能满足客户端需求的文档,可以给出一个错误响应,或者可以把现存的文档转换成客户端可用的文档,这叫转码。 41 | 42 | ![](imgs/h17-5.png) 43 | 44 | 有 3 种类别的转码:格式转换、信息综合以及内容注入。 45 | 46 | ### 格式转换 47 | 格式转换是指将数据从一种格式转换为另一种格式,使之可以被客户端查看。 48 | 49 | ### 信息综合 50 | 从文档中提取关键的信息片段称为信息综合。这种操作的例子包括根据小节标题生成文档的大纲,或者从页面中删除广告和商标。 51 | 52 | ### 内容注入 53 | 内容注入转码会增加文档的内容。这种例子有自动广告生成器和用户追踪系统。 -------------------------------------------------------------------------------- /lab-dhcp.md: -------------------------------------------------------------------------------- 1 | # Wireshark实验:探究DHCP (Page240) 2 | 1. UDP 3 | 2. 相同 4 | 3. 帧的目的地址都是全 f, 源地址是自己的 MAC 地址。 5 | 4. message type, client ip address, next server address。 6 | 5. 0x69e2f890, 由客户端选择的一个随机数,用于客户端与服务器交流和响应。 7 | 6. 客户端源地址为 0.0.0.0,目的地址为 255.255.255.255,服务端源地址为自己的 IP 地址,目的地址为 255.255.255.255。 8 | 7. 192.168.0.1。 9 | 8. 192.168.0.1,OFFER 报文。 10 | 9. relay agent address。 11 | 10. 路由器是本机的默认网关,子网掩码表示本机的网络号。 12 | 11. requested ip address。 13 | 12. 避免下线的客户端继续占用着 IP 地址,86400s。 14 | 13. 不想要现在的 IP 地址,不确认,服务端会认为客户端还是在租用期内。 15 | 14. 有,ARP 根据 IP 地址找出相应的物理地址。 16 | 17 | ## 参考资料 18 | * 官方文档第六版:[Wireshark_DHCP_v6.0.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-DHCP/Wireshark_DHCP_v6.0.pdf) 19 | * 官方文档第七版:[Wireshark_DHCP_v7.0.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-DHCP/Wireshark_DHCP_v7.0.pdf) 20 | * 翻译:[Wireshark_DHCP_v7.0_Simplified_Chinese.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-DHCP/Wireshark_DHCP_v7.0_Simplied_Chinese.pdf) ([CHN-STUDENT](https://github.com/chn-student) ) 21 | * 解答:[计算机网络实验-DHCP.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-DHCP/计算机网络实验-DHCP.pdf)( [CHN-STUDENT](https://github.com/chn-student) ) -------------------------------------------------------------------------------- /docs/icmp.md: -------------------------------------------------------------------------------- 1 | # ICMP 网际控制报文协议文档 2 | ICMP 允许主机或路由器报告差错情况和提供有关异常情况的报告,ICMP 报文是装在 IP 数据报中的,作为其数据部分。 3 | 4 | ## ICMP 报文 5 | #### 报文种类 6 | 1. ICMP 差错报告报文。 7 | 2. ICMP 询问报文。 8 | 9 | ![](../imgs/icmp1.png) 10 | 11 | ![](../imgs/icmp2.png) 12 | 13 | ICMP 报文的前 4 个字节是统一的格式,共有 3 个字段:类型、代码、检验和。接着的 4 个字节的内容与 ICMP 类型有关。 14 | #### 差错报告类型 15 | 1. 终点不可达 当终点不可达时向源点发送终点不可达报文。 16 | 2. 时间超过 TTL 为零时丢弃报文,还要向源点发送时间超过报文。 17 | 3. 参数问题 当路由器或主机收到的数据报中的字段不正确时,就丢弃该数据报,并向源点发送参数问题报文。 18 | 4. 改变路由(重定向) 路由器把改变路由报文发给主机,让主机知道下次应将数据报发给另外的路由器(可通过更好的路由)。 19 | 20 | ![](../imgs/icmp3.png) 21 | 22 | ICMP 差错报告报文段中的数据字段都具有同样的格式。它把需要进行差错报告的 IP 数据报首部以及数据部分的前 8 个字节(为了得到运输层的端口号以及运输层报文的发送序号(对于 TCP))提取出来,作为 ICMP 报文段的数据。再加上 ICMP 差错报告报文的前 8 个字节,就构成了 ICMP 差错报告报文。 23 | 24 | #### 不应发送差错报告报文的几种情况 25 | 1. 对 ICMP 差错报告报文,不再发送 ICMP 差错报告报文。 26 | 2. 对第一个分片的数据报片的所有后续数据报片,都不发送 ICMP 差错报告报文。 27 | 3. 对具有多播地址的数据报,都不发送 ICMP 差错报告报文。 28 | 4. 对具有特殊地址(127.0.0.1 或 0.0.0.0)的数据报,都不发送 ICMP 差错报告报文。 29 | 30 | #### 常用的 ICMP 询问报文有两种 31 | 1. 回送请求和回答 32 | 33 | ICMP 回送请求向一个特定的目的主机发出询问,收到此报文的主机必须给源发送 ICMP 回答报文,用来测试目的站是否可达以及了解其有关状态。 34 | 35 | tracert 出现请求超时的情况: 36 | * 超时的节点设备(如网络设备路由器、服务器等)做了安全设置,禁止ICMP协议即禁ping 37 | * 超时的节点网络拥塞或者网络质量差延时过大所致 38 | * 超时的节点设备宕机/关机等对ICMP协议无法响应 39 | 40 | 2. 时间戳请求和回答 41 | 42 | ICMP 时间戳请求报文请求目的主机或路由器回答当前的日期和时间,时间戳请求和回答可用于时钟同步和测量。 43 | 44 | #### ICMP 应用举例 45 | 1. 分组网间探测 ping,用来测试两台主机之间的连通性。 46 | 2. traceroute(win: tracert),用来跟踪一个分组从源点到终点的路径。 47 | -------------------------------------------------------------------------------- /lab-nat.md: -------------------------------------------------------------------------------- 1 | # Wireshark实验:探究NAT (Page240) 2 | 1. 192.168.1.100。 3 | 3. 192.168.1.100:4335, 64.233.169.104:80。 4 | 4. 7.158797, 64.233.169.104:80, 192.168.1.100:4335。 5 | 5. 7.075657, 192.168.1.100:4335, 64.233.169.104:80, 64.233.169.104:80, 192.168.1.100:4335, 7.108986。 6 | 6. 6.069168, 71.192.34.104:4335, 64.233.169.104:80, 检验和、TTL、源地址不同。 7 | 7. 没有, 检验和发生了变化,每经过一个路由器都要重新计算首部校验和。 8 | 8. 6.117570, 64.233.169.104:80, 71.192.34.104:4335, 检验和、TTL、目的地址不同。 9 | 9. 6.035475 和 6.067775, 71.192.34.104:4335, 64.233.169.104:80,检验和、TTL 不同。 10 | 10. 192.168.1.100:4335 -> 71.192.34.104:4335 11 | 12 | ## 参考资料 13 | * 官方文档第六版:[Wireshark_NAT_v6.0.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-NAT/Wireshark_NAT_v6.0.pdf) 14 | * 官方文档第七版:[Wireshark_NAT_v7.0.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-NAT/Wireshark_NAT_v7.0.pdf) 15 | * 翻译:[Wireshark_NAT_v7.0_Simplified_Chinese.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-NAT/Wireshark_NAT_v7.0_Simplied_Chinese.pdf) ([CHN-STUDENT](https://github.com/chn-student) ) 16 | * 解答:[计算机网络实验-NAT.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-NAT/计算机网络实验-NAT.pdf)( [CHN-STUDENT](https://github.com/chn-student) ) -------------------------------------------------------------------------------- /lab-wireless.md: -------------------------------------------------------------------------------- 1 | # Wireshark实验:探究802.11 (Page383) 2 | 1. linksys12, 30 Munroe St 3 | 2. Beacon Interval: 0.102400 [Seconds] 4 | 3. 00:16:b6:f7:1d:51 5 | 4. ff:ff:ff:ff:ff:ff 6 | 5. 00:16:b6:f7:1d:51 7 | 6. Tag: Supported Rates 1(B), 2(B), 5.5(B), 11(B), [Mbit/sec], Tag: Extended Supported Rates 6(B), 9, 12(B), 18, 24(B), 36, 48, 54, [Mbit/sec] 8 | 7. ap 地址 00:16:b6:f7:1d:51, 源地址 00:13:02:d1:b6:4f, 目的地址 00:16:b6:f4:eb:a8, 第一跳地址是 ap 地址 9 | 8. ap 地址 00:16:b6:f7:1d:51, 源地址 00:16:b6:f4:eb:a8, 目的地址 91:2a:b0:49:b6:4f, 第一跳地址是 ap 地址 10 | 11 | ## 参考资料 12 | * [beacon帧字段结构最全总结(一)——beacon基本结构](https://www.cnblogs.com/fengf233/p/10919335.html) 13 | * 官方文档第六版:[Wireshark_802.11_v6.0.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-802.11/Wireshark_802.11_v6.0.pdf) 14 | * 官方文档第七版:[Wireshark_802.11_v7.0.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-802.11/Wireshark_802.11_v7.0.pdf) 15 | * 翻译:[Wireshark_802.11_v7.0_Simplified_Chinese.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-802.11/Wireshark_802.11_v7.0_Simplified_Chinese.pdf) ([CHN-STUDENT](https://github.com/chn-student) ) 16 | * 解答:[计算机网络实验-802.11.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-802.11/计算机网络实验-802.11.pdf)( [CHN-STUDENT](https://github.com/chn-student) ) -------------------------------------------------------------------------------- /lab-ethernet.md: -------------------------------------------------------------------------------- 1 | # Wireshark实验:探究以太网和ARP (Page335) 2 | 1. 90:2b:34:d9:77:db 3 | 2. b4:0f:3b:fa:4c:70, 不是,它是以太网帧下一跳目的站的 MAC 地址。 4 | 3. 0x0800, IPv4 5 | 4. 55,各种首部加上已经出现的 “GET” 中的 G 这个字节。 6 | 5. b4:0f:3b:fa:4c:70,以太网帧的上一跳地址,通常来说是我计算机地址的默认网关的适配器。 7 | 6. 90:2b:34:d9:77:db,我计算机的地址,设备是适配器。 8 | 7. 0x0800, IPv4 9 | 9. IP 地址,物理地址,类型 10 | 10. 90:2b:34:d9:77:db,ff:ff:ff:ff:ff:ff 11 | 11. 0x0806(ARP) 12 | 12. a:21, b:1, c:包含, d: TAR MAC address 字段 13 | 13. a:21, b:2, c: Sender MAC address 字段 14 | 14. b4:0f:3b:fa:4c:70, 90:2b:34:d9:77:db 15 | 15. 与这个请求分组要查询的 IP 地址一致的主机才会收下这个 ARP 请求分组 16 | 17 | ## 参考资料 18 | * 官方文档第六版:[Wireshark_Ethernet_ARP_v6.01.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-Ethernet-ARP/Wireshark_Ethernet_ARP_v6.01.pdf) 19 | * 官方文档第七版:[Wireshark_Ethernet_ARP_v7.0.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-Ethernet-ARP/Wireshark_Ethernet_ARP_v7.0.pdf) 20 | * 翻译:[Wireshark_ARP_v7.0_Simplified_Chinese.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-Ethernet-ARP/Wireshark_Ethernet_ARP_v7.0_simpified_chinese.pdf) ([CHN-STUDENT](https://github.com/chn-student) ) 21 | * 解答:[计算机网络实验-以太网和ARP.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-Ethernet-ARP/计算机网络实验-以太网和ARP.pdf)([CHN-STUDENT](https://github.com/chn-student) ) -------------------------------------------------------------------------------- /lab-Introduction.md: -------------------------------------------------------------------------------- 1 | # Wireshark实验:入门 (Page52) 2 | 第一个实验的目的主要是向你介绍Wireshark。以下问题将证明您已经能够使Wireshark启动并运行,并且已经探索了其中一些功能。根据您的Wireshark实验回答以下问题: 3 | 4 | 输入 URL `http://gaia.cs.umass.edu/wireshark-labs/INTRO-wireshark-file1.html`,开始捕获。 5 | 6 | #### 1. 列出上述步骤7中出现在未过滤的分组列表窗口的协议列中的3种不同的协议。 7 | http tcp dns 8 | #### 2. 从HTTP GET消息发送到HTTP OK回复需要多长时间? (默认情况下,分组列表窗口中的时间列的值是自Wireshark开始捕获以来的时间(以秒为单位)。要想以日期格式显示时间,请选择Wireshark的“视图”下拉菜单,然后选择“时间显示格式”,然后选择“日期和时间”。) 9 | 1.158458 - 0.835180 = 0.323278 10 | #### 3. gaia.cs.umass.edu(也称为wwwnet.cs.umass.edu)的Internet地址是什么?您的计算机的Internet地址是什么? 11 | 1. 128.119.245.12 12 | 2. 192.168.0.118 13 | #### 4. 打印问题2提到的两个HTTP消息(GET和OK)。要这样做,从Wireshark的“文件”菜单中选择“打印”,然后选择“仅选中分组”和“按当前显示”按钮,然后单击确定。 14 | 15 | ## 参考资料 16 | 17 | Wireshark实验:入门 (Page52) 18 | * 官方文档第六版:[Wireshark_Intro_v6.0.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-Intro/Wireshark_Intro_v6.0.pdf) 19 | * 官方文档第七版:[Wireshark_Intro_v7.0.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-Intro/Wireshark_Intro_v7.0.pdf) 20 | * 翻译:[Wireshark实验-Intro.md](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-Intro/Wireshark实验-Intro.md) 21 | * 解答:[计算机网络实验-入门.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-Intro/计算机网络实验-入门.pdf)( [CHN-STUDENT](https://github.com/chn-student) ) 22 | -------------------------------------------------------------------------------- /lab-ssl.md: -------------------------------------------------------------------------------- 1 | # Wireshark实验:探究SSL (Page437) 2 | 1. 128.238.38.162, 216.75.194.220, 有包含 1 个、2 个、3 个的帧,版本有 sslv2 sslv3 3 | 2. content type 1 字节, version 2 字节, length 2 字节 4 | 3. 22 5 | 4. Random: 42dbf0c21b781c6c644b84fe4efa7be6ef21efc98e350355… 6 | 5. 非对称加密算法 rsa, 对称加密算法 rc4, 哈希算法 md5 7 | 6. 非对称加密算法 rsa, 对称加密算法 rc4, 哈希算法 md5 8 | 7. Random: 0000000042dbed263707fc0f473df2dbcc0cd768f9aa9902…, 32 字节, 用于生成主密钥(master key)的32字节的随机数(主密钥由客户端和服务端的随机数共同生成) 9 | 8. 包含,用于会话复用 10 | 9. 不包含,证书单独发送,从例子来看需要 3 个帧发送。 11 | 10. 包含,用来让服务器用私钥解密。 12 | 11. 告诉服务器我已经计算好加密密钥,以后会用商定的加密方式和密钥加密传输, 6 字节。 13 | 12. 消息校验码是加密的。 14 | 15 | ## 参考资料 16 | * [SSL、TLS协议格式、HTTPS通信过程、RDP SSL通信过程](https://www.cnblogs.com/littlehann/p/3733469.html) 17 | * 官方文档第六版:[Wireshark_SSL_v6.0.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-SSL/Wireshark_SSL_v6.0.pdf) 18 | * 官方文档第七版:[Wireshark_SSL_v7.0.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-SSL/Wireshark_SSL_v7.0.pdf) 19 | * 翻译:[Wireshark_SSL_v7.0_Simplified_Chinese.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-SSL/Wireshark_SSL_v7.0_Simplified_Chinese.pdf) ([CHN-STUDENT](https://github.com/chn-student) ) 20 | * 解答:[计算机网络实验-SSL.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-SSL/计算机网络实验-SSL.pdf)( [CHN-STUDENT](https://github.com/chn-student) ) -------------------------------------------------------------------------------- /docs/http/18.md: -------------------------------------------------------------------------------- 1 | # Web 主机托管 2 | 对内容资源的存储、协调以及管理的职责统称为 **Web 主机托管**。 3 | 如果不想自行管理服务器所需的软硬件,就需要主机托管服务,即托管者。托管者出租服务和网站管理维护业务,并提供各种不同程度的安全级别、报告及易用性。 4 | 5 | ## 主机托管服务 6 | 用户向服务提供商租用 Web 服务器,就可以不用自己购买服务器并管理软件了。 7 | 8 | ## 虚拟主机托管 9 | 共享主机托管或虚拟主机托管就是让多个用户共享一台 Web 服务器。每个网站看起来是托管在不同的服务器上的,但实际上是托管在同一个物理服务器上。 10 | 托管者可以创建成排同样的服务器,称为服务器集群,把负载分摊在群里的服务器上。 11 | 12 | ### 虚拟服务器请求缺乏主机信息 13 | HTTP/1.0 请求在报文中只发送了 URL 的路径部分,没有主机名,这让共享 Web 服务器无法分辨请求要访问哪个网站。 14 | 15 | ### 设法让虚拟主机托管正常工作 16 | 缺失主机信息是 HTTP 规范的疏忽,它错误地假设了每个 Web 服务器只托管了一个网站。所以 URL 中的主机名信息被当作冗余信息剥离了,只要求发送路径部分。 17 | 18 | ![](imgs/h18-1.png) 19 | 20 | ### HTTP/1.1 的 Host 首部 21 | Host 首部是 HTTP/1.1 的请求首部。 22 | 23 | ![](imgs/h18-2.png) 24 | 25 | 对于没有进行虚拟主机托管,而且不允许资源随请求主机的不同而变化的服务器来说,可以忽略 Host 首部字段的值。 26 | 27 | 但资源会随请求主机名的不同而变化的服务器,都必须在一条 HTTP/1.1 请求判断其所请求的资源时使用下列规则。 28 | 29 | ![](imgs/h18-3.png) 30 | 31 | ## 使网站更可靠 32 | ### 镜像的服务器集群 33 | 服务器集群是一排配置相同的服务器,可以互相替换。每个服务器上的内容都可以通过镜像复制,这样当某个服务器出问题的时候,其他的可以顶上。 34 | 35 | ![](imgs/h18-4.png) 36 | 37 | 镜像服务器可以在不同的地点包含同样内容的副本。例如主服务器在芝加哥、复制服务器在纽约。 38 | 39 | ![](imgs/h18-5.png) 40 | 41 | 在上图中,有两种方法可以把客户端的请求导向特定的服务器: 42 | 1. HTTP 重定向。该内容的 URL 会解析到主服务器的 IP 地址,然后它会发送重定向到复制服务器。 43 | 2. DNS 重定向。该内容的 URL 会解析到 4 个 IP 地址,DNS 服务器可以选择发送给客户端的 IP 地址。 44 | 45 | ### 内容分发网络 CDN 46 | CDN 就是对特定内容进行分发的专门网络,这个网络中的节点可以是服务器、反向代理或缓存。 47 | 48 | ### CDN 中的反向代理缓存 49 | 复制服务器可以用反向代理缓存来代替,反向代理和镜像服务器之间的区别在于反向代理通常是需求驱动的。 50 | 51 | 反向代理不会保存服务器的全部内容副本,它们只保存客户端请求的那部分内容。 52 | 53 | CDN 中带有反向代理时,可能会由于存在代理的层次关系而增加其复杂性。 54 | 55 | ## 让网站更快 56 | 服务器集群和分布式代理缓存或反向代理服务器分散了网络流量,可以避免拥塞。分发内容使之更靠近终端用户。 -------------------------------------------------------------------------------- /docs/http/1.md: -------------------------------------------------------------------------------- 1 | # HTTP 概述 2 | ## 资源 3 | #### MIME 4 | 多用途因特网邮件扩展(MIME)用来描述并标记多媒体内容。HTTP 给每种要通过 Web 传输的对象都打上 MIME 类型的数据格式标签。 5 | MIME 类型是一种文本标记,表示一种主要的对象类型和一个特定的子类型,中间由一条斜杠隔开。 6 | 7 | ![](imgs/h1-1.png) 8 | 9 | [常见 MIME 类型列表](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types) 10 | #### URI 11 | 每个服务器资源都有一个名字,被称为统一资源标识符 URI。URI 在世界范围内唯一标识并定位信息资源。 12 | 13 | #### URL 14 | 统一资源定位符 URL 是资源标识符最常见的形式,它是 URI 的子集,URL 描述了一台特定服务器上某个资源的位置。 15 | 16 | URL 格式包含三个部分: 17 | 1. 第一部分称为方案,说明了访问资源所使用的协议类型,通常是 http 协议。 18 | 2. 第二部分给出了因特网的服务器地址,例如 `www.baidu.com`。 19 | 3. 第三部分部分是资源路径,指定了服务器的某个资源,例如 `/a/b.html/`。 20 | 21 | 现在,几乎所有的 URI 都是 URL。 22 | 23 | #### URN 24 | URI 的第二种形式是统一资源名 URN。URN 是作为内容的唯一名称使用的,与目前资源的所在地无关。使用 URN,可以将资源四处移动,不管资源在哪都能通过 URN 找到。 25 | 例如,不管 RFC 2141 位于何处,都能通过 `urn:ietf:rfc:2141` 找到它。 26 | 27 | ## 事务 28 | HTTP 事务由请求命令和响应结果组成,这种通信是通过名为 HTTP 报文的格式化数据完成的。一个网页可以包含多条事务。 29 | #### 方法 30 | HTTP 的请求命令被称为方法,每条 HTTP 请求包含一个方法。这个方法告诉服务器要执行什么动作。 31 | 32 | ![](imgs/h1-2.png) 33 | 34 | #### 状态码 35 | 每条 HTTP 响应报文都会携带一个状态码,用来告知客户端请求结果或是否需要采取其他动作。除了数字状态码,HTTP 还会发送一条解释性的“原因短语”描述文本。 36 | 37 | ## 报文 38 | HTTP 报文分为请求报文和响应报文,除此之外没有其他类型的报文。 39 | HTTP 报文分为三部分: 40 | 1. 起始行,在请求报文中用来说明要做些什么,在响应报文中说明出现了什么情况。 41 | 2. 首部字段,起始行后面有零或多个首部字段。每个首部字段都会包含一个名字和一个值,两者之间用冒号隔开,首部以一个空行结束。 42 | 3. 主体,可选。起始行和首部字段都是文本形式且结构化的,而主体可以包含任意格式的数据。 43 | 44 | ## Web 的结构组件 45 | 1. 代理,位于客户端和服务器之间的实体。 46 | 2. 缓存,HTTP 的仓库,使常用页面的副本可以保存在离客户端更近的地方。 47 | 3. 网关,连接其他应用程序的特殊服务器。 48 | 4. 隧道,对 HTTP 报文进行盲转发的特殊代理。 49 | 5. Agent 代理,发起自动 HTTP 请求的半智能 Web 客户端。浏览器就是 Agent 代理。 -------------------------------------------------------------------------------- /codes/socket4-proxyserver/server.js: -------------------------------------------------------------------------------- 1 | const http = require('http') 2 | const port = 8080 3 | const host = 'localhost' 4 | const cache = {} 5 | 6 | // 代理监听浏览器请求 7 | const proxy = http.createServer((req, res) => { 8 | if (cache[req.url]) { 9 | readCache(res, cache[req.url]) 10 | return 11 | } 12 | 13 | proxyRequest(req, res) 14 | }) 15 | 16 | proxy.listen(port, host, () => { 17 | console.log('server listening') 18 | }) 19 | 20 | function proxyRequest(req, res) { 21 | console.log('发出代理请求:' + req.url.slice(1)) 22 | const options = { 23 | hostname: req.url.slice(1), 24 | } 25 | 26 | // 代理转发浏览器请求 27 | const proxyreq = http.request(options, proxyres => { 28 | proxyres.setEncoding('utf8') 29 | 30 | let data = '' 31 | proxyres.on('data', chunk => { 32 | data += chunk 33 | }) 34 | 35 | // 将响应结果返回给用户 36 | proxyres.on('end', () => { 37 | res.writeHead(proxyres.statusCode, proxyres.headers) 38 | res.end(data) 39 | cache[req.url] = { 40 | data, 41 | statusCode: proxyres.statusCode, 42 | headers: proxyres.headers 43 | } 44 | }) 45 | }) 46 | 47 | proxyreq.on('error', err => { 48 | console.error(`请求遇到问题: ${ err.message }`) 49 | res.writeHead('404') 50 | res.end('') 51 | }) 52 | 53 | proxyreq.end() 54 | } 55 | 56 | function readCache(res, data) { 57 | console.log('读取缓存') 58 | res.writeHead(data.statusCode, data.headers) 59 | res.end(data.data) 60 | } -------------------------------------------------------------------------------- /docs/http/13.md: -------------------------------------------------------------------------------- 1 | # 摘要认证 2 | ## 摘要认证的改进 3 | 摘要认证是另一种 HTTP 认证协议,相对 HTTP 基本认证协议,它做了如下改进: 4 | 1. 不以明文方式在网络上发送密码。 5 | 2. 可以防止恶意用户捕获并重放认证的握手过程。 6 | 3. 可以有选择地防止对报文内容的篡改。 7 | 4. 防范其他几种常见的攻击方式。 8 | 9 | 摘要认证不是最安全的的协议,它不能满足很多安全 HTTP 事务的需求。对这些需求来说,使用 TLS 和 HTTPS 协议更为合适一些。 10 | 11 | ![](imgs/h13-1.png) 12 | 13 | ### 单向摘要 14 | 使用 MD5 对输入进行摘要加密。 15 | 16 | ### 用随机数防止重放攻击 17 | 服务器可以向客户端发送一个称为随机数的特殊令牌,客户端在计算摘要前将这个随机数令牌附加到密码上去。如果没有随机数,摘要认证就会变得跟基本认证一样脆弱。 18 | 随机数是在 www-Authenticate 质询中从服务器传送给客户端的。 19 | 20 | ### 摘要认证的握手机制 21 | 摘要认证比基本认证多了一些首部字段,其中有一个可选的 Authorization-info。 22 | 下图是简化的摘要认证三步握手机制。 23 | 24 | ![](imgs/h13-2.png) 25 | 26 | ![](imgs/h13-3.png) 27 | 28 | ## 摘要的计算 29 | 摘要认证的核心就是对公共信息、保密信息和有时限的随机值这个组合的单向摘要。 30 | 31 | ### 摘要算法的输入数据 32 | 摘要是根据以下三个组件计算出来的: 33 | 1. 由单向散列函数 H(d) 和摘要 KD(s,d) 组成的一对函数,其中 s 表示密码,d 表示数据。 34 | 2. 一个包含了安全信息的数据块,包括密码,称为 A1。 35 | 3. 一个包含了请求报文中非保密属性的数据块,称为 A2。 36 | 37 | ### 与安全性相关的数据 A1 38 | A1 数据块是密码和受保护信息的产物,它包含有用户名、密码、保护域和随机数等内容。A1 只涉及安全信息,与底层报文自身无关。 39 | 40 | 两种计算 A1 的方式: 41 | 1. MD5,为每条请求运行单向散列函数。A1 是由冒号连接起来的用户名、域以及密码三元组。 42 | 2. MD5-sess。 43 | 44 | ![](imgs/h13-4.png) 45 | 46 | ### 与报文有关的数据 A2 47 | 数据块 A2 表示的是与报文自身有关的信息,比如 URL、请求方法和报文实体的主体部分。A2 有助于防止方法、资源或报文篡改。 48 | 49 | A2 有两种策略: 50 | 1. 第一种策略只包含 HTTP 请求方法和 URL。当 qop="auth" 时使用这种策略。 51 | 2. 第二种策略添加了报文实体的主体部分,以提供一定程度的报文完整性检测。qop="auth-int" 时使用。 52 | 53 | ![](imgs/h13-5.png) 54 | 55 | ### 摘要算法总述 56 | ![](imgs/h13-6.png) 57 | 58 | ### 预授权 59 | 在普通的认证方式中,每条请求都要有一次请求/质询的循环。如果客户端事先知道下一个随机数是什么,就可以取消这个请求/质询的循环,这样客户端就可以在服务器发出请求前,生成正确的 Authoirzation 首部了。这样可以预先将 Authoirzation 首部发送给服务器,而不用进行请求/质询了。 60 | 61 | ![](imgs/h13-7.png) 62 | 63 | 摘要认证提供了几种预授权方式: 64 | 1. 预先生成下一个随机数。 65 | 2. 受限的随机数重用机制。 66 | 3. 同步生成随机数。 -------------------------------------------------------------------------------- /docs/ppp.md: -------------------------------------------------------------------------------- 1 | # ppp 点对点协议文档 2 | 3 | 在通信线路质量较差的年代,高级数据链路控制 HDLC 成为当时比较流行的数据链路层协议。 4 | 但现在已经很少使用了,相对简单的点对点协议 PPP 是目前使用最广泛的数据链路层协议。 5 | PPP 协议是用户计算机和 ISP 进行通信时所使用的数据链路层协议。 6 | 7 | ![](../imgs/ppp4.png) 8 | 9 | PPP 不需要进行纠错,不需要设置序号,也不需要进行流量控制,只支持点对点的链路通信,只支持全双工链路。 10 | ### PPP 通信过程 11 | 1. 结点 A 的数据链路层把网络层下发的 IP 数据报添加首部和尾部封装成帧。 12 | 2. 结点 A 把封装好的帧发送给结点 B 的数据链路层。 13 | 3. 若结点 B 收到的帧出错,则丢弃;否则从帧中提取 IP 数据报上交给网络层。 14 | 15 | ![](../imgs/ppp1.png) 16 | 17 | ### PPP 协议设计需求 18 | 1. 简单,对接收到的帧进行 CRC 检测,正确则收下,错误则丢弃,其他什么都不做。 19 | 2. 封装成帧,必须有帧定界符。 20 | 3. 透明性,必须保证数据传输的透明性。 21 | 4. 多种网络层协议,能够在同一条物理链路上同时支持多种网络层协议运行。 22 | 5. 多种类型链路,必须能够在多种类型的链路上运行。 23 | 6. 差错检测,对帧进行检测,并丢弃错误的帧。 24 | 7. 检测连接状态,必须有一种机制能够及时(不超过几分钟)检测链路是否处于正常工作状态。 25 | 8. 最大传送单元(MTU),MTU 是数据链路层的帧可以载荷的数据部分的最大长度,不是帧的总长度。 26 | 9. 网络层地址协商,提供一种机制使连接的双方的网络层能够通过协商知道彼此的网络层地址。 27 | 10. 数据压缩协商,提供一种方法来协商使用数据压缩算法。 28 | 29 | 运行在以太网上的 PPP 协议叫 PPPoE(PPP over Ethernet),这个协议把 PPP 帧封装在以太网帧中。 30 | 31 | ### PPP 协议的组成 32 | PPP 协议有三个组成部分 33 | 1. 一个将 IP 数据报封装到串行链路的方法。 34 | 2. 一个用来建立、配置和测试数据链路连接的链路控制协议 LCP。 35 | 3. 一套网络控制协议 NCP。 36 | 37 | ### PPP 协议的帧格式 38 | ![](../imgs/ppp5.png) 39 | 40 | 1. 标志字段 F(flag),规定为 0x7E,表示为一个帧的开始或结束。 41 | 2. 地址字段 A,规定为 0xFF。 42 | 3. 控制字段 C,规定为 0x03。 43 | 4. 协议字段,0x0021 表示信息字段是 IP 数据报;0xC021,表示是 LCP 的数据;0x8021 表示是网络层的控制数据。 44 | 5. 信息字段,长度可变,不超过 1500 字节。 45 | 6. FCS 字段,是使用 CRC 的帧检验序列 FCS。 46 | 47 | ### 字节填充 48 | 当信息字段中出现和标志字段一样的比特组合时(0x7E),将使用转义字符 0x7D 对其进行转义。 49 | ``` 50 | 0x7E -> 0x7D, 0x5E 51 | 0x7D -> 0x7D, 0x5D 52 | ``` 53 | 若信息字段中出现 ASCII 码的控制字符(数值小于 0x20 的字符),则在该字符前面加上 0x7D,同时将该字符的编码加以改变。 54 | ``` 55 | 0x03 -> 0x7D, 0x23 56 | ``` 57 | 58 | ### 零比特填充 59 | PPP 协议用在 SONET/SDH 链路时将使用同步传输,在这种情况下,PPP 协议采用零比特填充方法。 60 | 具体做法:在发送前,对信息字段扫描,只要发现有 5 个连续的 1,则填入一个 0,接收端则相反。 61 | 62 | ### PPP 协议的工作状态 63 | ![](../imgs/ppp6.png) -------------------------------------------------------------------------------- /docs/dns.md: -------------------------------------------------------------------------------- 1 | # DNS 文档 2 | 域名系统 DNS 能够将域名转换为 IP 地址,它被设计为联机分布式数据库系统,并采用客户-服务器方式。 3 | DNS 采用高速缓存来减轻查询压力,高速缓存用来存放最近查询过的域名以及从何处获得域名映射信息的记录。 4 | 5 | ## DNS 报文格式 6 | ![](https://github.com/woai3c/Computer-Networking-Lab/blob/master/imgs/dns-protocol-format.png) 7 | ## 解析过程 8 | ### 1. 主机向本地域名服务器查询一般采用递归查询。 9 | 如果主机询问的本地域名服务器不知道被查询域名的 IP 地址,那本地域名服务器就以 DNS 客户的身份继续向其他域名服务器发出查询请求报文。 10 | 因此,递归查询的返回结果要么是查找到的 IP 地址,要么是报错,即没查找到结果。 11 | 12 | ### 2. 本地域名服务器向根域名服务器的查询通常采用迭代查询 13 | 当根域名服务器收到本地域名服务器的查询时,要么给出所查询的 IP 地址,要么告诉本地域名服务器下一步应该向哪个顶级域名服务器查询,然后本地域名服务器继续 14 | 向顶级域名服务器查询。顶级域名服务器收到本地域名服务器的查询时,要么给出所查询的 IP 地址,要么告诉本地域名服务器下一步应该向哪个权限域名服务器查询, 15 | 本地域名服务器就这样进行迭代查询,最后把所查询到的结果返回给发起查询的主机。当然,本地域名服务器也能采用递归方式查询,取决于最初的查询报文的设置。 16 | 17 | ![](https://github.com/woai3c/Computer-Networking-Lab/blob/master/imgs/dns-example.png) 18 | 19 | ## 名词解释 20 | ### 域名 21 | 任何一个连接在互联网上的主机或路由器,都有一个唯一的层次结构的名字,称为域名,域名总共不超过 255 个字符。 22 | DNS 不规定一个域名需要包含多少个下级域名,也不规定每一级的域名代表什么意思。 23 | 24 | ![](https://github.com/woai3c/Computer-Networking-Lab/blob/master/imgs/dns-name-format.png) 25 | 26 | ### 域名分类 27 | 在国家顶级域名下注册的二级域名均由该国家自行确定。假如某个单位拥有自己的域名,它就可以自行决定是否要进一步划分其下属的子域。 28 | #### 1. 国家顶级域名 29 | cn us uk... 30 | #### 2. 通用顶级域名 31 | com net org int edu gov mil... 32 | #### 3. 基础结构域名 33 | 这种域名只有一个,即 arpa,用于反向域名解析,又叫反向域名。 34 | 35 | ![](https://github.com/woai3c/Computer-Networking-Lab/blob/master/imgs/dns-space.png) 36 | 37 | ### 域名服务器类型 38 | ![](https://github.com/woai3c/Computer-Networking-Lab/blob/master/imgs/dns-server.png) 39 | #### 1. 根域名服务器 40 | 最高层次、最重要的域名服务器,根域名服务器知道所有顶级域名服务器的域名和地址。本地域名服务器如果解析不了域名,就要向根域名服务器求助。 41 | 大多数情况下,根域名服务器会告诉本地域名服务器下一步应该找哪个顶级域名服务器进行查询。 42 | #### 2. 顶级域名服务器 43 | 这些服务器负责管理在该顶级域名服务器注册的所有二级域名。 44 | 45 | #### 3. 权限域名服务器 46 | DNS 采用划分区的方式来管理域名系统,每一个区设置相应的权限域名服务器,用来保存该区中的所有主机的域名到 IP 地址的映射。 47 | 区是 DNS 服务器实际管辖范围,区不能大于域。当一个权限域名服务器不能给出结果时,就会告诉客户下一步要找哪个权限域名服务器。 48 | 49 | #### 4. 本地域名服务器 50 | 当一台主机发出 DNS 请求时,这个请求就会发往本地域名服务器。每一个互联网提供者 ISP,或者一个大学甚至一个系,都可以拥有一个本地域名服务器。 51 | 为了提高 DNS 可靠性,DNS 会把数据复制到几个域名服务器来保存。如果主域名服务器出故障了,其他的辅助域名服务器可以保证 DNS 查询工作不会中断。 52 | -------------------------------------------------------------------------------- /docs/http/11.md: -------------------------------------------------------------------------------- 1 | # 客户端识别与 cookie 机制 2 | ## HTTP 首部 3 | 下表列出了最常见的七种用来承载用户相关信息的 HTTP 首部。 4 | 5 | ![](imgs/h11-1.png) 6 | 7 | From 首部可以用来发送用户的电子邮件地址,但服务器有可能会搜集这些信息来发垃圾邮件,所以很少浏览器会发送 From 首部。 8 | 9 | User-Agent 首部可以将用户浏览器的相关信息发送给服务器。 10 | 11 | Referer 首部提供了用户来源页面的 URL,根据它可以知道用户是从哪个页面跳过来的。 12 | 13 | 这三个首部都不能实现可靠的识别。 14 | 15 | ## 客户端的 IP 地址 16 | 使用客户端 IP 地址来识别用户存在很多缺点: 17 | 1. IP 地址描述的是机器,不是用户。如果多个用户共用一台机器,就无法对其进行区分了。 18 | 2. 很多 ISP 会在用户登录时为其分配动态 IP 地址,有可能用户每次登录都是不同的 IP 地址。 19 | 3. 很多用户都是通过网络地址转换 NAT 防火墙来浏览网络的。这些设备隐藏了用户真正的 IP 地址。 20 | 4. 客户的请求可能会经过很多网关或代理,导致服务器得到的是网关或代理的 IP 地址。 21 | 22 | ## 胖 URL 23 | 有些网站会为用户生成特定的 URL 来追踪用户身份,例如在 URL 后面加一个用户 ID。改动后包含了用户状态信息的 URL 称为胖 URL。 24 | 25 | ## cookie 26 | 大多数缓存和浏览器都不允许对 cookie 的内容进行缓存。 27 | ### cookie 类型 28 | cookie 可分为会话 cookie 和持久 cookie。 29 | 30 | 会话 cookie 是临时的 cookie,它记录了用户访问网站时的设置和偏好。用户退出浏览器时,会话 cookie 就被删除了。 31 | 32 | 持久 cookie 生存时间更长一些,它存储在硬盘上,浏览器退出,计算机重启时它们仍然在。持久 cookie 通常用来维护某个用户周期性访问的网站的配置文件或登录名。 33 | 34 | 会话 cookie 和持久 cookie 之间唯一的区别就是它们的过期时间,如果设置了 Discard 参数,或者没有设置 Expires 或 Max-age 参数说明扩展的时间,那这个 cookie 就是会话 cookie。 35 | 36 | ### cookie 是如何工作的 37 | 服务器给每个用户分配一个 cookie。 38 | cookie 包含了一个由 `name=value` 这样的信息构成的列表,并通过 Set-Cookie 或 Set-Cookie2 HTTP 响应(扩展)首部将其分配给用户。 39 | 40 | ![](imgs/h11-2.png) 41 | 42 | 浏览器会记住从服务器返回的 Set-Cookie 或 Set-Cookie2 首部中的 cookie 内容,并将 cookie 内容存储在浏览器的 cookie 数据库中。 43 | 44 | ### cookie 罐: 客户端的状态 45 | cookie 的基本思想就是让浏览器存储一些服务器特有的信息,每次访问服务器都把这些信息提供给它。cookie 规范的正式名称为 HTTP 状态管理机制。 46 | 不同的浏览器有可能会将 cookie 存储在不同的文件夹。 47 | 48 | ### 不同的网站使用不同的 cookie 49 | 浏览器只向服务器发送服务器产生的那些 cookie,也就是说 A 网站的服务器只会获得 A 网站的 cookie,而不会是别的网站。 50 | 51 | #### cookie 的域属性 52 | 产生 cookie 的服务器可以向 Set-cookie 响应首部添加一个 Domain 属性来控制哪些网站可以查看 cookie。 53 | 54 | #### cookie 的路径属性 55 | cookie 规范允许用户将 cookie 与部分网站关联起来。可以通过 Path 属性来实现这一功能,在这个属性列出的 URL 路径前缀下所有 cookie 都是有效的。 56 | 57 | ![](imgs/h11-3.png) 58 | 59 | ### cookie 的成分 60 | cookie 有两个版本:版本 0 和版本 1。 61 | 62 | ![](imgs/h11-4.png) 63 | 64 | #### 版本0 65 | ![](imgs/h11-5.png) 66 | 67 | ![](imgs/h11-6.png) 68 | 69 | #### 版本1 70 | ![](imgs/h11-7.png) 71 | 72 | ![](imgs/h11-8.png) -------------------------------------------------------------------------------- /docs/wireshark.md: -------------------------------------------------------------------------------- 1 | # wireshark 语法 2 | ## 捕捉过滤器 3 | 4 | |Protocol|Direction|Host(s)|Value|Logical Operations|Other expression| 5 | |-|-|-|-|-|-| 6 | |tcp|dst|10.1.1.1|80|and|tcp dst 10.2.2.2 3128| 7 | 8 | ### Protocol(协议) 9 | * ther 10 | * fddi 11 | * ip 12 | * arp 13 | * rarp 14 | * decnet 15 | * lat 16 | * sca 17 | * moprc 18 | * mopdl 19 | * tcp 20 | * udp 21 | 22 | ### Direction(方向) 23 | * src 24 | * dst 25 | * src and dst 26 | * src or dst 27 | 28 | 如果没有特别指明来源或目的地,则默认使用 src or dst 作为关键字。 29 | 30 | 例如,host 10.2.2.2 与 src or dst host 10.2.2.2 是一样的。 31 | 32 | ### Host(s): 33 | * net 34 | * port 35 | * host 36 | * portrange 37 | 38 | 如果没有指定此值,则默认使用 host 关键字。 39 | 40 | 例如,src 10.1.1.1 与 src host 10.1.1.1 相同。 41 | 42 | ### Logical Operations(逻辑运算) 43 | * not 44 | * and 45 | * or 46 | 47 | not 具有最高的优先级。or 和 and 具有相同的优先级,运算时从左至右进行。 48 | 49 | 例如, 50 | 51 | “not tcp port 3128 and tcp port 23″与”(not tcp port 3128) and tcp port 23″相同。 52 | 53 | “not tcp port 3128 and tcp port 23″与”not (tcp port 3128 and tcp port 23)”不同。 54 | 55 | ## 显示过滤器 56 | 57 | |Protocol|.|String 1|.|String 2|Comparison operator|Value|Logical Operations|Other expression| 58 | |-|-|-|-|-|-|-|-|-| 59 | |ftp||passive||ip|==|10.2.3.4 |xor|ticmp.type| 60 | 61 | 例子: 62 | 63 | snmp || dns || icmp 显示SNMP或DNS或ICMP封包。 64 | 65 | ip.addr == 10.1.1.1 显示来源或目的IP地址为10.1.1.1的封包。 66 | 67 | ip.src != 10.1.2.3 or ip.dst != 10.4.5.6 显示来源不为10.1.2.3或者目的不为10.4.5.6的封包。 68 | 69 | ip.src != 10.1.2.3 and ip.dst != 10.4.5.6 显示来源不为10.1.2.3并且目的IP不为10.4.5.6的封包。 70 | 71 | tcp.port == 25 显示来源或目的TCP端口号为25的封包。 72 | 73 | tcp.dstport == 25 显示目的TCP端口号为25的封包。 74 | 75 | tcp.flags 显示包含TCP标志的封包。 76 | 77 | tcp.flags.syn == 0×02 显示包含TCP SYN标志的封包。 78 | 79 | 如果过滤器的语法是正确的,表达式的背景呈绿色。如果呈红色,说明表达式有误。 80 | 81 | ## 封包详细信息 (Packet Details Pane) 82 | 这个面板是我们最重要的,用来查看协议中的每一个字段。 83 | 84 | 各行信息分别为 85 | * Frame: 物理层的数据帧概况 86 | * Ethernet II: 数据链路层以太网帧头部信息 87 | * Internet Protocol Version 4: 互联网层IP包头部信息 88 | * Transmission Control Protocol: 传输层T的数据段头部信息,此处是TCP 89 | * Hypertext Transfer Protocol: 应用层的信息,此处是HTTP协议 90 | 91 | ## 参考资料 92 | * [wireshark使用教程及过滤语法总结——血泪史的汇聚](https://www.zhoulujun.cn/html/tools/NetTools/PacketCapture/7908.html) 93 | -------------------------------------------------------------------------------- /docs/http/20.md: -------------------------------------------------------------------------------- 1 | # 重定向与负载均衡 2 | ![](imgs/h20-1.png) 3 | 4 | ## 为什么要重定向 5 | Web 内容通常分布在很多地方,这么做是出于可靠性地考虑。 6 | 如果一个位置出问题了,还有其他的可用; 7 | 如果客户端能访问较近的内容,就可以减小时延; 8 | 目标服务器分散,还可以减小时延。 9 | 10 | 可以将重定向当作一组有助于找到最佳分布式内容的技术。 11 | 12 | ## 重定向到何地 13 | 从客户端的角度来看,服务器、代理、缓存、网关对它来说都是服务器,很多重定向技术都能应用在它们身上。 14 | 15 | 服务器会根据每个 IP 来处理请求,将请求分摊到复制服务器中去。 16 | 17 | ## 重定向协议概览 18 | 重定向的目标是尽快地将 HTTP 报文发送到可用的服务器上去。 19 | 20 | ![](imgs/h20-2.png) 21 | 22 | ![](imgs/h20-3.png) 23 | 24 | ![](imgs/h20-4.png) 25 | 26 | ## 通用的重定向方法 27 | ### HTTP 重定向 28 | HTTP 重定向可作为一种简单的负载均衡形式来使用。处理重定向的服务器找到可用的负载最小的内容服务器,并将浏览器重定向到那台服务器上去。 29 | HTTP 重定向的优点之一就是知道客户端的 IP 地址,所以它能作出更合理地选择。 30 | 31 | ![](imgs/h20-5.png) 32 | 33 | ### DNS 重定向 34 | DNS 允许将多个 IP 地址关联到一个域。最简单的 DNS 决策算法就是轮转。 35 | 36 | 大多数 DNS 客户端只会使用多地址集中的第一个地址,为了负载均衡,DNS 服务器会在每次完成查询后对地址进行轮转。这通常称为 DNS 轮转。 37 | 38 | #### DNS 缓存带来的影响 39 | DNS 的结果有可能会被缓存起来,很多浏览器都会使用 DNS 缓存,从而减少 DNS 查找的开销。这样可能会让 DNS 轮转起不到想要的效果。 40 | 41 | #### 其他基于 DNS 的重定向算法 42 | 1. 负载均衡算法。有些 DNS 服务器会跟踪服务器的负载,将负载最轻的服务器放在列表最前面。 43 | 2. 邻接路由算法,服务器集群在地理上分散时,DNS 服务器会尝试将用户导向最近的服务器。 44 | 3. 故障屏蔽算法,DNS 服务器可以监视网络的状况,并将请求绕过有故障的地方。 45 | 46 | ![](imgs/h20-6.png) 47 | 48 | ### 任播寻址 49 | 任播(英语:anycast)是一种网络定址和路由的策略,使得数据可以根据路由拓扑来决定送到“最近”或“最好”的目的地。 50 | 51 | 任播是与单播(unicast)、广播(broadcast)和多播(multicast)不同的方式。 52 | 53 | * 在单播中,在网络地址和网络节点之间存在一一对应的关系。 54 | * 在广播和多播中,在网络地址和网络节点之间存在一对多的关系:每一个发送地址对应一群接收可以复制信息的节点。 55 | * 在任播中,在网络地址和网络节点之间存在一对多的关系:每一个地址对应一群接收节点,但在任何给定时间,只有其中之一可以接收到发送端来的信息。 56 | 57 | ![](imgs/h20-7.png) 58 | 59 | ### IP MAC 转发 60 | ![](imgs/h20-8.png) 61 | 62 | ### IP 地址转发 63 | NAT 网络地址转发。 64 | 65 | ## 代理的重定向方法 66 | ### 显式浏览器配置 67 | ### 代理自动配置 68 | 自动配置方式可以动态配置浏览器,需要使用代理自动配置协议(PAC)。 69 | 70 | ![](imgs/h20-9.png) 71 | 72 | ### Web 代理自动发现协议 73 | WPAD 的目标是在不要求终端用户手工配置代理设置,而且不依赖透明流量拦截的情况下,为浏览器提供一种发现并使用附近代理的方式。 74 | 75 | ![](imgs/h20-10.png) 76 | 77 | ![](imgs/h20-11.png) 78 | 79 | ![](imgs/h20-12.png) 80 | 81 | ## 缓存重定向方法 82 | Cisco 公司开发的 WCCP 可以使路由器将 Web 流量重定向到代理缓存中去。WCCP 负责路由器和缓存服务器之间的通信,在缓存之间实现负载均衡。 83 | 84 | ![](imgs/h20-13.png) 85 | 86 | ![](imgs/h20-14.png) 87 | 88 | ## 因特网缓存协议 89 | ![](imgs/h20-15.png) 90 | 91 | ## 缓存阵列路由协议 92 | ![](imgs/h20-16.png) 93 | 94 | ## 超文本缓存协议 95 | ![](imgs/h20-17.png) -------------------------------------------------------------------------------- /docs/http/2.md: -------------------------------------------------------------------------------- 1 | # URL 和资源 2 | URL 提供了一种统一命名资源的方式。 3 | ``` 4 | 方案://服务器位置/路径 5 | ``` 6 | ![](imgs/h2-1.png) 7 | 8 | URL 可以通过 HTTP 以外的协议来访问资源。例如个人的电子邮件协议: 9 | ``` 10 | mailto:411020382@qq.com 11 | ``` 12 | 或者其他协议,比如 FTP: 13 | ``` 14 | ftp://ftp.test.com/test.xls 15 | ``` 16 | 或者从流视频服务器上下载电影: 17 | ``` 18 | rtsp://www.test.com:554/video 19 | ``` 20 | 21 | ## URL 的语法 22 | 大多数的 URL 语法都建立在这个由 9 个部分组成的通用格式上: 23 | ``` 24 | ://:@:/;?# 25 | ``` 26 | 几乎没有哪个 URL 包含了所有这些组件。URL 最重要的是方案(scheme)、主机(host)、路径(path)。 27 | 28 | ![](imgs/h2-2.png) 29 | 30 | #### 方案——使用什么协议 31 | 方案实际上是规定如何访问指定资源的主要标识符,它会告诉负责解析 URL 的应用程序应该使用什么协议。 32 | 33 | #### 主机与端口 34 | 主机组件标识了因特网上能够访问资源的宿主机器。端口组件标识了服务器正在监听的网络端口。 35 | 36 | #### 用户名和密码 37 | 有些服务器要求输入用户名和密码才能访问: 38 | ``` 39 | ftp://test:my_password@ftp.prep.mit.edu/pub/gnu 40 | ``` 41 | 以上例子用户名为 `test`,密码为 `my_password`。 42 | 43 | #### 路径 44 | 路径组件说明了资源位于服务器的什么地方。 45 | ``` 46 | http://test.com/test.html 47 | ``` 48 | 以上 URL 的路径为 `test.html`。 49 | 50 | #### 参数 51 | 参数组件向应用程序提供了它们所需的输入参数,以便正确地和服务器交互。 52 | ``` 53 | http://test.com/test.html?key=value&key2=value2 54 | ``` 55 | 在这例子中,有两个查询参数,中间用 `&` 隔开。其中一个参数名称为 `key`,值为 `value`。 56 | 57 | #### 片段 58 | 有些资源类型还可以做进一步的划分,例如 HTML。URL 使用片段组件来表示一个资源内部的片段。片段挂在 URL 的右手边,前端有一个字符 `#`。 59 | ``` 60 | https://github.com/woai3c/Front-end-basic-knowledge/blob/master/HTML.md#viewport 61 | ``` 62 | 在以上 URL 中,`#` 后面的 `viewport` 就是一个片段。浏览器从服务器获得整个资源后,会根据片段来显示你感兴趣的那部分资源。 63 | 64 | ## URL 快捷方式 65 | #### 相对 URL 66 | URL 有两种:绝对的和相对的。 67 | 68 | 绝对 URL 拥有访问资源的完整信息。相对 URL 是不完整的,要想从相对 URL 中获取访问资源的完整信息,就必须相对于另一个。 69 | ``` 70 | http://test.com/index.html 71 | ``` 72 | 假如在这个文档中有一个包含了 URL `./test2.html` 的超链接,点击它跳转页面的时候当前 URL 会转换为 `http://test.com/test2.html`。 73 | 74 | 相对 URL 是基于基础 URL 进行解释的。在上面的例子中,基础 URL 为 `http://test.com/index.html`。 75 | 76 | #### 自动扩展 URL 77 | 有些浏览器在用户输入 URL 的时候会尝试自动扩展 URL。自动扩展有两种方式: 78 | 1. 主机名扩展,只要有些小提示,浏览器就可以将你输入的主机名扩展为完整的主机名。例如输入 `yahoo`,浏览器会自动扩展为 `www.yahoo.com`。 79 | 2. 历史扩展,浏览器会将以前访问过的 URL 存储起来,当你输入 URL 的时候,浏览器就可以将你的输入和历史记录中的 URL 的前缀进行匹配,并提供一些完整的选项供你选择。 80 | 81 | ## 各种令人头疼的字符 82 | #### 编码机制 83 | 为了避开安全字符集表示法带来的限制,人们设计了一种编码机制,用来在 URL 中表示不安全的字符。这种机制通过一种转义表示法来表示不安全的字符。 84 | 这种转义表示法包含一个百分号(%),后面跟着两个表示字符 ASCII 码的十六进制数。 85 | 86 | ![](imgs/h2-3.png) 87 | 88 | #### 字符限制 89 | 在 URL 中,有几个字符被保留起来,有着特殊的含义。有些字符不在定义的 ASCII 可打印字符集中。还有些字符会与某些因特网网关和协议产生混淆,因此不建议使用。 90 | 91 | ![](imgs/h2-4.png) 92 | -------------------------------------------------------------------------------- /docs/http/9.md: -------------------------------------------------------------------------------- 1 | # Web 机器人 2 | Web 机器人是能够在无需人类干预的情况下自动进行一系列 Web 事务处理的软件程序。很多机器人会从一个网站逛到另一个网站,获取内容,跟踪链接,并对它们找到的数据进行处理。 3 | 4 | ## 爬虫及爬行方式 5 | 爬虫是一种机器人,它们会递归地对各种信息网站进行遍历,获取第一个页面,然后获取那个页面指向的所有页面,依次类推。 6 | 搜索引擎使用爬虫在 Web 上游荡,并把它们碰到的文档全部拉回来。然后对这些文档进行处理,形成一个可搜索的数据库。 7 | 8 | ### 从哪儿开始:根集 9 | 爬虫开始访问的 URL 初始集合被称作根集。挑选根集时,应该从足够多不同的站点中选择 URL。 10 | 11 | ![](imgs/h9-1.png) 12 | 13 | ### 链接的提取和相对链接的标准化 14 | 爬虫在 Web 上移动时,会不停地对 HTML 页面进行解析。它对每个页面的 URL 链接进行分析,并将这些链接添加到需要爬行的页面列表中去。同时要将相对 URL 转换为绝对形式。 15 | 16 | ### 避免环路的出现 17 | ![](imgs/h9-2.png) 18 | 19 | ### 循环与复制 20 | ![](imgs/h9-3.png) 21 | 22 | ### 面包屑留下的痕迹 23 | 爬虫对访问过的地址进行管理时使用的一些技术: 24 | 1. 树和散列表。 25 | 2. 有损的存在位图,将爬行过的 URL 的存在位“置位”。 26 | 3. 检查点,一定要将已访问 URL 列表保存到硬盘上,以防机器人程序崩溃。 27 | 4. 分类,使用机器人集群来爬行整个 Web。 28 | 29 | ### 规范化 URL 30 | ![](imgs/h9-4.png) 31 | 32 | 大多数机器人都试图将 URL “规范化” 为标准格式来消除别名。规范化步骤: 33 | 1. 如果没有指定端口,就向主机名中添加“:80”。 34 | 2. 将所有转义字符 %xx 都转换成等价字符。 35 | 3. 删除 # 标签。 36 | 37 | 经过这些步骤就可以消除上图中 a~c 所列的别名问题了。 38 | 39 | ![](imgs/h9-5.png) 40 | 41 | ### 文件系统连接环路 42 | ![](imgs/h9-6.png) 43 | 44 | ### 避免循环和重复 45 | 有些技术可以使机器人避免环路的出现: 46 | 1. 规范化 URL。 47 | 2. 广度优先的爬行。 48 | 3. 节流,限制一段时间内机器人可以从一个网站获取的页面数量。 49 | 4. 限制 URL 的大小。 50 | 5. URL/站点黑名单,将会造成机器人环路的网站加入黑名单。 51 | 6. 模式检测,拒绝爬行多于两个或三个重复组件的 URL。 52 | 7. 内容指纹,对页面内容进行检验和,如果一个页面的校验和同之前某个检验和一样,就不去爬行这个页面。 53 | 8. 人工监视。 54 | 55 | ## 机器人的 HTTP 56 | 机器人和其他 HTTP 客户端程序没有什么区别,都要遵循 HTTP 规范中的规则。 57 | 58 | ## 行为不当的机器人 59 | 不守规矩的机器人会造成很多严重的问题: 60 | 1. 失控机器人,由于环路或逻辑错误可能会向服务器发出大量的负载。 61 | 2. 失效的 URL,机器人可能会对大量不存在的 URL 发起请求,加重服务器的负担。 62 | 3. 很长的错误 URL,如果 URL 太长,会降低服务器的性能。 63 | 4. 爱打听的机器人,机器人可能会得到一些私有数据的 URL,从而访问私有数据。 64 | 5. 动态网关访问,机器人可能会获取一个内容来自网关应用程序的 URL。 65 | 66 | ## 拒绝机器人访问 67 | 人们定义了一个称为“拒绝机器人访问标准”,服务器在其根目录下提供一个可选的、名为 robots.txt 的文件。这个文件包含的信息说明了机器人可以访问哪些信息。 68 | 69 | ![](imgs/h9-7.png) 70 | 71 | ### HTML 的 robot-control 元标签 72 | HTML 可以通过 META 标签对机器人提供一些限制。 73 | ``` 74 | 75 | ``` 76 | 1. NOINDEX,告诉机器人不要对页面的内容进行处理,忽略文档。 77 | 2. NOFOLLOW,告诉机器人不要爬行这个页面的任何外连链接。 78 | 3. INDEX,告诉机器人可以对页面的内容进行索引。 79 | 4. FOLLOW,告诉机器人可以爬行页面上的任何外连链接。 80 | 5. NOARCHIVE,告诉机器人不应该缓存这个页面的本地副本。 81 | 6. ALL,等价于 INDEX、FOLLOW。 82 | 7. NONE,等价于 NOINDEX、NOFOLLOW。 83 | 84 | #### 搜索引擎的 META 标签 85 | ![](imgs/h9-8.png) 86 | 87 | ## 搜索引擎 88 | 现代的搜索引擎都构建了一些名为“全文索引”的复杂本地数据库,装载了全世界的页面及其内容。 89 | ### 全文索引 90 | 全文索引就是一个数据库,给它一个单词,它可以立即提供包含那个单词的所有文档。 91 | 92 | ![](imgs/h9-9.png) 93 | 94 | ### 对结果进行排序,并提供查询结果 95 | 一旦搜索引擎通过其索引得到了结果,网关应用程序就会获取结果,并将其拼成页面提供给用户。 -------------------------------------------------------------------------------- /docs/http/http2-5.md: -------------------------------------------------------------------------------- 1 | # HTTP/2 协议 2 | ## HTTP/2 分层 3 | HTTP/2 可分为两部分:分帧层、数据或 HTTP 层。 4 | 5 | HTTP/2 的特点: 6 | 1. 二进制协议; 7 | 2. 首部压缩; 8 | 3. 多路复用; 9 | 4. 加密传输。 10 | 11 | ## 连接 12 | ![](imgs/h22-7.png) 13 | 14 | ![](imgs/h22-8.png) 15 | 16 | ## 帧 17 | HTTP/2 是基于帧的协议。采用分帧是为了将重要信息封装起来,让协议的解析方可以轻松阅读、解析并还原信息。 18 | 19 | 而 HTTP/1.1 是以文本分隔的。解析 HTTP/1.1 不需要什么高科技,但往往速度慢且容易出错。你需要不断地读入字节,直到遇到分隔符 CRLF 为止,同时还要考虑不守规矩的客户端,它只会发送 LF。 20 | 21 | 解析 H1 的请求或响应会遇到以下问题: 22 | 1. 一次只能处理一个请求或响应,完成之前不能停止解析。 23 | 2. 无法预判解析需要多少内存。 24 | 25 | H2 有了帧,处理协议的程序就能预先知道会收到什么,并且 H2 有表示帧长度的字段。 26 | 27 | ![](imgs/h22-9.png) 28 | 29 | 前 9 个字节每个帧都是一样的。解析时只需要读取这些字节,就可以知道在整个帧中期望的字节数。 30 | 31 | ![](imgs/h22-10.png) 32 | 33 | 由于 H2 是分帧的,请求和响应可以交错甚至多路复用。多路复用有助于解决类似队头阻塞的问题。 34 | 35 | H2 协议有 10 种不同的帧类型。 36 | 37 | ![](imgs/h22-11.png) 38 | 39 | ![](imgs/h22-12.png) 40 | 41 | ## 流 42 | HTTP/2 规范对流的定义是:HTTP/2 连接上独立的、双向的帧序列交换。如果客户端想要发出请求,它会开启一个新流,然后服务器在这个流上回复。 43 | 由于有分帧,所以多个请求和响应可以交错,而不会互相阻塞。流 ID 用来标识帧所属的流。 44 | 45 | 客户端到服务器的 H2 连接建立后,通过发送 HEADERS 帧来启动新的流。如果首部需要跨多个帧,可能还会发送 CONTINUATION 帧。该 HEADERS 帧可能来自请求或响应。 后续流启动的时候,会发送一个带有递增流 ID 的新 HEADERS 帧。 46 | 47 | ![](imgs/h22-13.png) 48 | 49 | ### 消息 50 | HTTP 消息泛指 HTTP 请求或响应。流是用来传输一对请求/响应消息的。 51 | 52 | ![](imgs/h22-14.png) 53 | 54 | ![](imgs/h22-15.png) 55 | 56 | H1 的请求和响应部分都分成消息首部和消息体两部分;H2 的请求和响应分成 HEADERS 帧和 DATA 帧。 57 | 58 | ![](imgs/h22-16.png) 59 | 60 | H2 没有分块编码,也不需要。并且不再有 101 响应。 61 | 62 | ### 流量控制 63 | H2 的新特性之一是基于流的流量控制。WINDOW_UPDATE 帧用来指示流量控制信息。每个帧告诉对方,发送方想接收多少字节。 64 | 65 | ![](imgs/h22-17.png) 66 | 67 | ### 优先级 68 | H2 的最后一个重要特性是依赖关系。通过 HEADERS 帧和 PRIORITY 帧,客户端可以明确地和服务器沟通它需要什么,以及它需要这些资源的顺序。 69 | 70 | 1. 依赖关系为客户端提供了一种能力,通过指明某些对象对另一些对象有依赖,告知服务器这些对象应该优先传输。 71 | 2. 权重让客户端告诉服务器如何确定具有共同依赖关系的对象的优先级。 72 | 73 | ## 服务器推送 74 | 推送使服务器能够主动将对象发给客户端,这可能是因为它知道客户端不久将用到该对象。 75 | 76 | ### 推送对象 77 | ![](imgs/h22-18.png) 78 | 79 | ![](imgs/h22-19.png) 80 | 81 | ![](imgs/h22-20.png) 82 | 83 | ### 选择要推送的资源 84 | 如果服务器接收到一个 HTML 页面的请求,它需要决定是推送页面上的资源还是等客户端来请求。决策过程如下: 85 | 1. 资源已经在浏览器缓存中的概率; 86 | 2. 从客户端来看,这些资源的优先级(CSS、JS等); 87 | 3. 可用的带宽,以及其他类似的会影响客户端接收推送的资源。 88 | 89 | 如果服务器选择正确,那就有助于提升页面的整体性能,反之则会损耗页面性能。由于这个原因,如今通用的服务端推送方案非常少。 90 | 91 | ## 首部压缩 92 | HPACK 是种表查找压缩方案,它利用霍夫曼编码获得接近 GZIP 的压缩率。 93 | 94 | ![](imgs/h22-21.png) 95 | 96 | ![](imgs/h22-22.png) 97 | 98 | 可以看到,前者与后者很多数据重复了。这二者只有 36 字节是不同的,如果仅发送这 36 字节,就可以节省约 85% 的字节数。HPACK 原理就是这样的。 99 | 100 | ![](imgs/h22-23.png) 101 | 102 | ![](imgs/h22-24.png) -------------------------------------------------------------------------------- /codes/socket1-webserver/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | demo1 8 | 63 | 64 | 65 |
66 | 74 |
75 |
76 | 79 |
80 |
81 |

p1

82 |

p2

83 |
84 |
85 |

p3

86 |

p4

87 |
88 |
89 |
90 |
91 | 92 |
93 | 94 | -------------------------------------------------------------------------------- /lab-http.md: -------------------------------------------------------------------------------- 1 | # Wireshark实验 - HTTP (Page121) 2 | #### 1. 您的浏览器是否运行HTTP版本1.0或1.1?服务器运行什么版本的HTTP? 3 | 1. http1.1 4 | 2. http1.1 5 | #### 2. 您的浏览器会从接服务器接受哪种语言(如果有的话)? 6 | `Accept-Language: zh-CN,zh;q=0.9` 7 | #### 3. 您的计算机的IP地址是什么? gaia.cs.umass.edu服务器地址呢? 8 | 1. 192.168.0.118 9 | 2. 128.119.245.12 10 | #### 4. 服务器返回到浏览器的状态代码是什么? 11 | 200 OK 12 | #### 5. 服务器上HTML文件的最近一次修改是什么时候? 13 | `Last-Modified: Tue, 14 Apr 2020 05:59:01 GMT` 14 | #### 6. 服务器返回多少字节的内容到您的浏览器? 15 | 128 16 | #### 7. 通过检查数据包内容窗口中的原始数据,你是否看到有协议头在数据包列表窗口中未显示? 如果是,请举一个例子。 17 | 没有 18 | 19 | #### 8. 检查第一个从您浏览器到服务器的HTTP GET请求的内容。您在HTTP GET中看到了“IF-MODIFIED-SINCE”行吗? 20 | 第一次请求,不会有这个字段。 21 | #### 9. 检查服务器响应的内容。服务器是否显式返回文件的内容? 你是怎么知道的? 22 | 是,查看 `Line-based text data: text/html (10 lines)` 字段 23 | #### 10. 现在,检查第二个HTTP GET请求的内容。 您在HTTP GET中看到了“IF-MODIFIED-SINCE:”行吗? 如果是,“IF-MODIFIED-SINCE:”头后面包含哪些信息? 24 | 看到了,包含的信息为 `Tue, 14 Apr 2020 05:59:01 GMT` 25 | #### 11. 针对第二个HTTP GET,从服务器响应的HTTP状态码和短语是什么?服务器是否明确地返回文件的内容?请解释。 26 | 1. `HTTP/1.1 304 Not Modified` 27 | 2. 没有,因为有缓存 28 | 29 | #### 12. 您的浏览器发送多少HTTP GET请求消息?哪个数据包包含了美国权利法案的消息? 30 | 1 个,从第 81 个包开始就有美国权利法案的消息。 31 | #### 13. 哪个数据包包含响应HTTP GET请求的状态码和短语? 32 | 第 81 个包 33 | #### 14. 响应中的状态码和短语是什么? 34 | 200 OK 35 | #### 15. 需要多少包含数据的TCP段来执行单个HTTP响应和权利法案文本? 36 | 4 个 37 | 38 | #### 16. 您的浏览器发送了几个HTTP GET请求消息? 这些GET请求发送到哪个IP地址? 39 | 1. 4 个 40 | 2. 128.119.245.12 41 | #### 17. 浏览器从两个网站串行还是并行下载了两张图片?请说明。 42 | 串行,根据包的顺序。第一张图片响应完了才发的第二张图片请求。 43 | 44 | #### 18. 对于您的浏览器的初始HTTP GET消息,服务器响应(状态码和短语)是什么响应? 45 | `HTTP/1.1 401 Unauthorized` 46 | #### 19. 当您的浏览器第二次发送HTTP GET消息时,HTTP GET消息中包含哪些新字段? 47 | `Authorization: Basic d2lyZXNoYXJrLXN0dWRlbnRzOm5ldHdvcms=` 48 | ## 参考资料 49 | * [HTTP Headers](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers) 50 | * 官方文档第六版:[Wireshark_HTTP_v6.1.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-HTTP/Wireshark_HTTP_v6.1.pdf) 51 | * 官方文档第七版:[Wireshark_HTTP_v7.0.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-HTTP/Wireshark_HTTP_v7.0.pdf) 52 | * 翻译:[Wireshark实验-HTTP.md](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-HTTP/Wireshark实验-HTTP.md) 53 | * 解答部分1:[计算机网络实验-HTTP1.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-HTTP/计算机网络实验-HTTP1.pdf)( [CHN-STUDENT](https://github.com/chn-student) ) 54 | * 解答部分2:[计算机网络实验-HTTP2.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-HTTP/计算机网络实验-HTTP2.pdf)( [CHN-STUDENT](https://github.com/chn-student) ) 55 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 计算机网络-自顶向下-第六版实验 2 | ## 笔记 3 | * [Wireshark](https://github.com/woai3c/Computer-Networking-Lab/blob/master/docs/wireshark.md) 4 | * [网络安全](docs/internet-security.md) 5 | * [无线网络](docs/wireless-network.md) 6 | * [多媒体网络](docs/multi-media.md) 7 | #### 应用层 8 | * [http](https://github.com/woai3c/Computer-Networking-Lab/tree/master/docs/http) 9 | * [dns](https://github.com/woai3c/Computer-Networking-Lab/blob/master/docs/dns.md) 10 | * [ftp](https://github.com/woai3c/Computer-Networking-Lab/blob/master/docs/ftp.md) 11 | * [dhcp](https://github.com/woai3c/Computer-Networking-Lab/blob/master/docs/dhcp.md) 12 | #### 传输层 13 | * [tcp](https://github.com/woai3c/Computer-Networking-Lab/blob/master/docs/tcp.md) 14 | * [udp](https://github.com/woai3c/Computer-Networking-Lab/blob/master/docs/udp.md) 15 | #### 网络层 16 | * [ip](https://github.com/woai3c/Computer-Networking-Lab/blob/master/docs/ip.md) 17 | * [arp](https://github.com/woai3c/Computer-Networking-Lab/blob/master/docs/arp.md) 18 | * [icmp](https://github.com/woai3c/Computer-Networking-Lab/blob/master/docs/icmp.md) 19 | #### 数据链路层 20 | * [数据链路层](https://github.com/woai3c/Computer-Networking-Lab/blob/master/docs/ethernet.md) 21 | * [ppp](https://github.com/woai3c/Computer-Networking-Lab/blob/master/docs/ppp.md) 22 | 23 | #### [物理层](https://github.com/woai3c/Computer-Networking-Lab/blob/master/docs/physical-layer.md) 24 | ## 实验 25 | * [Wireshark实验:入门 (Page52)](https://github.com/woai3c/Computer-Networking-Lab/blob/master/lab-Introduction.md) 26 | * [Wireshark实验:HTTP (Page121)](https://github.com/woai3c/Computer-Networking-Lab/blob/master/lab-http.md) 27 | * [Wireshark实验:DNS (Page121)](https://github.com/woai3c/Computer-Networking-Lab/blob/master/lab-dns.md) 28 | * [Wireshark实验:探究TCP (Page200)](https://github.com/woai3c/Computer-Networking-Lab/blob/master/lab-tcp.md) 29 | * [Wireshark实验:探究UDP (Page201)](https://github.com/woai3c/Computer-Networking-Lab/blob/master/lab-udp.md) 30 | * [Wireshark实验:探究NAT (Page240)](lab-nat.md) 31 | * [Wireshark实验:探究DHCP (Page240)](lab-dhcp.md) 32 | * [Wireshark实验:探究IP (Page288)](https://github.com/woai3c/Computer-Networking-Lab/blob/master/lab-ip.md) 33 | * [Wireshark实验:探究以太网和ARP (Page335)](lab-ethernet.md) 34 | * [Wireshark实验:探究802.11 (Page383)](lab-wireless.md) 35 | * [Wireshark实验:探究SSL (Page437)](lab-ssl.md) 36 | 37 | ## 作业 38 | * [套接字编程作业1:Web服务器](https://github.com/woai3c/Computer-Networking-Lab/tree/master/codes/socket1-webserver) 39 | * [套接字编程作业2:UDPping程序](https://github.com/woai3c/Computer-Networking-Lab/tree/master/codes/socket2-udpping) 40 | * [套接字编程作业3:邮件客户端](https://github.com/woai3c/Computer-Networking-Lab/tree/master/codes/socket3-email) 41 | * [套接字编程作业4:多线程Web代理服务器](https://github.com/woai3c/Computer-Networking-Lab/tree/master/codes/socket4-proxyserver) 42 | 43 | ## 参考资料 44 | * [Computer-Networking-A-Top-Down-Approach-NOTES](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES) 45 | * [计算机网络--自顶向下](https://book.douban.com/subject/30280001/) 46 | * [计算机网络](https://book.douban.com/subject/26960678/) 47 | -------------------------------------------------------------------------------- /lab-dns.md: -------------------------------------------------------------------------------- 1 | # Wireshark实验:DNS (Page121) 2 | #### 4. 找到DNS查询和响应消息。它们是否通过UDP或TCP发送? 3 | UDP 4 | #### 5. DNS查询消息的目标端口是什么? DNS响应消息的源端口是什么? 5 | 1. 53 6 | 2. 53 7 | #### 6. DNS查询消息发送到哪个IP地址?使用ipconfig来确定本地DNS服务器的IP地址。这两个IP地址是否相同? 8 | 192.168.0.1 相同 9 | #### 7. 检查DNS查询消息。DNS查询是什么"Type"的?查询消息是否包含任何"answers"? 10 | 1. type A 11 | 2. `Answer RRs` 12 | #### 8. 检查DNS响应消息。提供了多少个"answers"?这些答案具体包含什么? 13 | 5 个 14 | ``` 15 | Answers 16 | www.ietf.org: type CNAME, class IN, cname www.ietf.org.cdn.cloudflare.net 17 | Name: www.ietf.org 18 | Type: CNAME (Canonical NAME for an alias) (5) 19 | Class: IN (0x0001) 20 | Time to live: 1 (1 second) 21 | Data length: 33 22 | CNAME: www.ietf.org.cdn.cloudflare.net 23 | www.ietf.org.cdn.cloudflare.net: type A, class IN, addr 104.20.1.85 24 | Name: www.ietf.org.cdn.cloudflare.net 25 | Type: A (Host Address) (1) 26 | Class: IN (0x0001) 27 | Time to live: 1 (1 second) 28 | Data length: 4 29 | Address: www.ietf.org.cdn.cloudflare.net (104.20.1.85) 30 | www.ietf.org.cdn.cloudflare.net: type A, class IN, addr 104.20.0.85 31 | Name: www.ietf.org.cdn.cloudflare.net 32 | Type: A (Host Address) (1) 33 | Class: IN (0x0001) 34 | Time to live: 1 (1 second) 35 | Data length: 4 36 | Address: www.ietf.org.cdn.cloudflare.net (104.20.0.85) 37 | ``` 38 | ``` 39 | Answers 40 | analytics.ietf.org: type CNAME, class IN, cname ietf.org 41 | Name: analytics.ietf.org 42 | Type: CNAME (Canonical NAME for an alias) (5) 43 | Class: IN (0x0001) 44 | Time to live: 1800 (30 minutes) 45 | Data length: 2 46 | CNAME: ietf.org 47 | ietf.org: type A, class IN, addr 4.31.198.44 48 | Name: ietf.org 49 | Type: A (Host Address) (1) 50 | Class: IN (0x0001) 51 | Time to live: 1800 (30 minutes) 52 | Data length: 4 53 | Address: ietf.org (4.31.198.44) 54 | ``` 55 | #### 9. 考虑从您主机发送的后续TCP SYN数据包。 SYN数据包的目的IP地址是否与DNS响应消息中提供的任何IP地址相对应? 56 | IP `104.20.1.85` 与 `www.ietf.org.cdn.cloudflare.net` 对应 57 | #### 10. 这个网页包含一些图片。在获取每个图片前,您的主机是否都发出了新的DNS查询? 58 | 59 | 60 | ## 参考资料 61 | * 官方文档第六版:[Wireshark_DNS_v6.01.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-DNS/Wireshark_DNS_v6.01.pdf) 62 | * 官方文档第七版:[Wireshark_DNS_v7.0.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-DNS/Wireshark_DNS_v7.0.pdf) 63 | * 翻译:[Wireshark实验-DNS.md](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-DNS/Wireshark实验-DNS.md) 64 | * 解答1:[DNS-参考答案.md](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-DNS/DNS-参考答案.md)( [Ying](https://github.com/IrisZhang) ) 65 | * 解答2:[计算机网络实验-DNS.pdf](https://github.com/moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES/blob/master/WiresharkLab/Wireshark实验-DNS/计算机网络实验-DNS.pdf)( [CHN-STUDENT](https://github.com/chn-student) ) 66 | 67 | **([CHN-STUDENT](https://github.com/chn-student)注:DNS实验中一个服务器已经不在使用,且部分现象无法解释,仅供参考。)** 68 | -------------------------------------------------------------------------------- /docs/http/14.md: -------------------------------------------------------------------------------- 1 | # 安全 HTTP 2 | 基本认证和摘要认证属于轻量级的方法,对于访问机密数据来说不够强大。 3 | 4 | ![](imgs/h14-1.png) 5 | ## HTTPS 6 | HTTPS 是最流行的 HTTP 安全形式,由网景公司首创,所有主要的浏览器和服务器都支持此协议。 7 | 使用 HTTPS 时,所有的 HTTP 请求和响应数据在发送之前,都要进行加密。加密可以使用 SSL 或 TLS。 8 | 9 | ![](imgs/h14-2.png) 10 | 11 | 大部分困难的编码及解码工作都是在 SSL 库中完成的,客户端或服务器在使用安全 HTTP 时无需过多地修改其协议处理逻辑。 12 | 13 | ## 数字加密 14 | 在这个数字加密技术的入门介绍中,会讨论以下内容: 15 | 1. 密码,对文本进行编码,使偷窥者无法识别的算法。 16 | 2. 密钥,改变密码行为的数字化参数。 17 | 3. 对称密钥加密系统,编/解码使用相同密钥的算法。 18 | 4. 非对称密钥加密系统,编/解码使用不同密钥的算法。 19 | 5. 公开密钥加密系统,一种能使数百万计算机便捷地发送机密报文的系统。 20 | 6. 数字签名,用来验证报文未被伪造或篡改的校验和。 21 | 7. 数字证书,由一个可信的组织验证和签发的识别信息。 22 | 23 | ### 密码编制的机制与技巧 24 | 密码学是对报文进行编/解码的机制与技巧。 25 | 26 | ### 密码 27 | 密码学基于一种名为密码的秘密代码。密码是一套编码方案——一种特殊的报文编码方式和一种稍后使用的相应解码方式的结合体。 28 | 加密前的报文称为明文,加密后的报文称为密文。 29 | 30 | ### 数字密码 31 | 给定一段明文报文 P、一个编码函数 E 和一个数字编码密钥 e,就可以生成一段经过编码的密文 C。通过解码函数 D 和解码密钥 d,可以将密文 C 解码为原始的明文 P。 32 | 33 | ![](imgs/h14-3.png) 34 | 35 | ## 对称密钥加密技术 36 | 对称密钥加密技术是因为它们加/解密使用相同的密钥。对称密钥加密算法主要包括:DES、3DES、IDEA、RC5、RC6等。 37 | 38 | ### 密钥长度与枚举攻击 39 | 在很多情况下,编/解码算法都是众所周知的,因此密钥就是唯一保密的东西了。 40 | 用暴力去尝试所有的密钥值称为枚举攻击。通常来说,密钥长度越长就越安全。 41 | 42 | 对称密钥加密技术的缺点之一就是发送者和接收者在对话之前,一定要有一个共享的密钥。 43 | 44 | ## 公开密钥加密技术 45 | 公开密钥加密技术使用了两个非对称密钥:一个用来对主机报文编码,另一个用来对主机报文解码。编码密钥是众所周知的,但解码密钥是私有的。 46 | 47 | ![](imgs/h14-4.png) 48 | 49 | 节点 x 可以将其加密密钥 ex 公之于众。任何想向节点 x 发送报文的人都可以使用相同的公开密钥,但只有 x 才能对报文进行解密。 50 | 51 | ![](imgs/h14-5.png) 52 | 53 | ### RSA 54 | 公开密钥非对称加密系统所面临的共同挑战是,要确保即使有人拥有了下面所有的线索,也无法计算出保密的私有密钥: 55 | 1. 公开密钥。 56 | 2. 一小片拦截下来的密文。 57 | 3. 一条报文及与之相关的密文。 58 | 59 | RSA 算法就是一个满足了所有这些条件的流行的公开密钥加密系统。 60 | 61 | ## 数字签名 62 | 用加密系统对报文进行签名,以说明是谁编写的报文,同时证明报文未被篡改过,这种技术称为数字签名。 63 | 64 | 数字签名是附加在报文上的特殊加密校验码。使用数字签名的好处有: 65 | 1. 签名可以证明是作者编写了这条报文。只有作者才会有最机密的私有密钥,因此,只有作者才能计算出这些校验和。 66 | 2. 签名可以防止报文被篡改,如果有人在报文传输过程中对其进行了修改,校验和就不再匹配了。 67 | 68 | 数字签名通常是用非对称公开密钥技术产生的。 69 | 70 | ![](../../imgs/is4.png) 71 | 72 | 看上图,任何人都能用 A 的公钥 PK 对密文进行 E 运算后得到 A 发送的明文。可见这种通信并非为了保密,而是为了进行签名和核实签名,即确认此信息是 A 发送的。 73 | 但上述过程仅对报文进行了签名,对报文 X 本身却未保密,所以要采用下图的方法,同时实现秘密通信和数字签名。 74 | 75 | ![](../../imgs/is5.png) 76 | 77 | ## 数字证书 78 | 数字证书中包含了由某个受信任组织担保的用户或公司的相关信息。 79 | 80 | ### 证书内容 81 | 数字证书通常包含以下内容: 82 | 1. 对象的名称(人、服务器、组织等)。 83 | 2. 过期时间。 84 | 3. 证书发布者(由谁为证书担保)。 85 | 4. 来自证书发布者的数字签名。 86 | 87 | 数字证书通常还包含对象的公开密钥、所用签名算法的描述性信息。任何人都可以创建一个数字证书,但并不是所有人都能获得受人尊敬的签发权,从而为证书信息担保,并用其私钥发证书。 88 | 89 | ![](imgs/h14-6.png) 90 | 91 | ### X.509 V3 证书 92 | 数字证书没有统一的标准,现在大多数的证书都使用 X.509 V3 标准,来存储它们的信息。 93 | 94 | ![](imgs/h14-7.png) 95 | 96 | ### 用证书对服务器进行认证 97 | ![](imgs/h14-8.png) 98 | 99 | ![](imgs/h14-9.png) 100 | 101 | ## HTTPS 细节介绍 102 | HTTPS 不是直接将 HTTP 报文发送给 TCP,而是将 HTTP 报文发送给一个安全层,在那进行加密。HTTP 安全层由 SSL 或 TLS 来实现。 103 | 104 | ### HTTPS 方案 105 | ![](imgs/h14-10.png) 106 | 107 | ![](imgs/h14-11.png) 108 | 109 | 在 HTTPS 中,客户端首先打开一条到服务器端口 443 的连接。一旦建立了 TCP 连接,客户端和服务器就会初始化 SSL 层,对加密参数进行沟通,并交换密钥。 110 | 握手完成后,SSL 初始化就完成了,客户端就可以将请求报文发送给安全层了。在将报文发送给 TCP 之前,要先对其进行加密。 111 | 112 | ![](imgs/h14-12.png) 113 | 114 | ![](imgs/h14-13.png) 115 | 116 | 如果还想看详细的过程,建议看看这篇文章 [SSL/TLS 握手过程详解](https://www.jianshu.com/p/7158568e4867)。 117 | 118 | ### 服务器证书 119 | SSL 支持双向认证,客户端和服务器都可以使用证书,但服务器要求使用客户端证书的情况很少。 120 | 服务器证书是一个显示了组织的名称、地址、服务器 DNS 域名以及其他信息的 X.509 V3 派生证书。客户端可以检查证书,以确保所有信息都是可靠的。 121 | 122 | ![](imgs/h14-14.png) 123 | 124 | ### 站点证书的有效性 125 | 浏览器对服务器证书的验证步骤: 126 | 127 | ![](imgs/h14-15.png) 128 | 129 | ## HTTPS 客户端实例 130 | SSL 是个复杂的二进制协议,借助一些开源的库,编写 SSL 客户端和服务器不会太难。 131 | OpenSSL 是 SSL 和 TLS 最常见的开源实现。 132 | -------------------------------------------------------------------------------- /docs/http/16.md: -------------------------------------------------------------------------------- 1 | # 国际化 2 | ## HTTP 对国际性内容的支持 3 | 为了支持国际性的内容,服务器需要告知客户端每个文档的字母表和语言,这样客户端才能正确地把文档中的信息解包为字符并把内容呈现给用户。 4 | 5 | 服务器通过 Content-Type 首部中的 charset 参数和 Content-Language 首部告知客户端文档的字母表和语言。这些首部描述了服务器实体主体的内容格式。 6 | 同时,客户端通过 Accept-Charset 首部和 Accept-Language 首部告知服务器它理解哪些字符集编码算法和语言以及其中的优先顺序。 7 | 8 | ## 字符集与 HTTP 9 | ### 字符集是把字符转换为二进制码的编码 10 | HTTP 字符集的值说明了如何把实体内容的二进制码转换为特定字母表中的字符。每个字符集标记都命名了一种把二进制码转换为字符的算法(反之亦然)。 11 | 字符集标记在由 IANA 维护的 MIME 字符集注册机构进行了标准化。 12 | 13 | ![](imgs/h16-1.png) 14 | 15 | 有些字符编码是可变长编码,这种类型的编码允许使用额外的二进制位表示拥有大量字符的字母表(比如汉语和日语),仅用较少的二进制位来表示标准的拉丁字符。 16 | 17 | ### 字符集和编码如何工作 18 | ![](imgs/h16-2.png) 19 | 20 | 国际化字符系统的关键目标是把语义(字母)和表示(图形化的显示形式)隔离开来。HTTP 只关心字符数据和相关语言及字符集标签的传输。字符形状的显示是由用户的图形显示软件(包括浏览器、操作系统、字体等)完成的。 21 | 22 | ### 字符集不对,字符就不对 23 | 如果客户端使用了错误的字符集参数,客户端就会显示一些奇怪的错乱字符。例如值 225 在不同的字符集中代表不同的字符。 24 | 25 | ### Content-Type 首部和 Charset 首部以及 META 标志 26 | 如果服务器没有在 Content-Type 首部中使用 Charset 参数指定字符集,那客户端就要设法从文档内容中推断出字符集。 27 | 对于 HTML 内容来说,可以在描述 charset 的 META 标记中找到字符集。 28 | 29 | ## 多语言字符编码入门 30 | 电子化字符系统的 8 个术语: 31 | 1. 字符,是指字母、数字、标点、表意文字、符号,或其他文本形式的书写“原子”。 32 | 2. 字形,描述字符的笔画图案或唯一的图形化形状。 33 | 3. 编码后的字符,分配给字符的唯一数字编号。 34 | 4. 代码空间,计划用于字符代码值的整数范围。 35 | 5. 代码宽度,每个字符代码所用的位数。 36 | 6. 字符库,特定的工作字符集(全体字符的一个子集)。 37 | 7. 编码后的字符集,组成字符库的已编码字符集,并为每个字符分配代码空间中的一个代码。它把数字化的字符代码映射为实际的字符。 38 | 8. 字符编码方案,把数字化的字符代码编码成一系列二进制码的算法(并能相应地反向解码)。 39 | 40 | ### 字符集的命名很糟糕 41 | MIME 中的 charset 标记描述的压根不是字符集。MIME 中的 charset 值所命名的是把数据位映射为唯一的字符的一整套算法。它是字符编码方案和编码后的字符集的组合。 42 | 43 | ### 字符 44 | 字符是书写的最基本的构建单元。 45 | 46 | ![](imgs/h16-3.png) 47 | 48 | ### 字形、连笔以及表示形式 49 | 字符是唯一的,每个字符可以有多种字形。很多手写体和字体允许人们把相邻的字符漂亮地连写起来,这称为连笔。 50 | 51 | ### 编码后的字符集 52 | 编码后的字符集把整数映射到字符。通过代码数值来索引,数组的元素就是字符。 53 | 54 | ![](imgs/h16-4.png) 55 | 56 | ### 字符编码方案 57 | 字符编码方案规定如何把字符的代码数字打包装入内容比特,以及在另一端如何将其解包回字符代码。字符编码方案有 3 种主要类型: 58 | 1. 固定宽度,处理迅速,但可能浪费空间; 59 | 2. 可变宽度(无模态),对不同的字符代码数字采用不同数量的比特; 60 | 3. 可变宽度(有模态),有模态的编码使用特殊的“转义”模式在不同的模态之间切换。 61 | 62 | ![](imgs/h16-5.png) 63 | 64 | 常见的编码方案: 65 | 1. 8 位,把每个字符代码编码为相应的 8 位二进制值。只能支持有 256 个字符代码范围的字符集。 66 | 2. UTF-8,采用无模态的变宽编码,第一字节的高位表示编码后的字符所用的字节数,所需的每个后续字节都含有 6 位的代码值。 67 | 68 | ![](imgs/h16-6.png) 69 | 70 | ## 语言标记与 HTTP 71 | ### Content-Language 首部 72 | Content-Language 首部字段用于描述实体的目标受众语言。如果内容是面向多种语言受众的,可以列出多种语言,用逗号分隔。 73 | 74 | ### Accept-Language 首部 75 | Accept-Language 请求头允许客户端声明它可以理解的自然语言,以及优先选择的区域方言。借助内容协商机制,服务器可以从诸多备选项中选择一项进行应用, 并使用 Content-Language 应答头通知客户端它的选择。 76 | 77 | ### 子标记 78 | 语言标记有一个或多个部分,用连字号分隔,称为子标记: 79 | 1. 第一个子标记称为主子标记,其值是标准化的; 80 | 2. 第二个子标记是可选的,遵循它自己的命名标准; 81 | 3. 其他尾随的子标记都是未注册的。 82 | 83 | 主子标记只能含有字母。其后的子标记可以拥有字母和数字,长度最多 8 个字符。 84 | ``` 85 | sgn-US-MA 86 | ``` 87 | 88 | 所有的标记都不区分大小写。但习惯上用大写字母表示国家,小写表示语言。 89 | 90 | 第一个和第二个语言子标记的值由各种标准文档以及相关的维护组织定义。 91 | 92 | ### 第一个子标记——名字空间 93 | 第一个子标记通常是标准化的语言记号,选自 ISO 639 中的语言标准集合。也可以用字母 i 来标识在 IANA 中注册的名字,或用 x 表示私有的或者扩展的名字。 94 | 95 | 如果第一个子标记含有: 96 | 1. 2 个字符,那就是来自 ISO 639 和 ISO 639-1 标准的语言代码; 97 | 2. 3 个字符,来自 ISO 639-2 标准及其扩展的语言代码; 98 | 3. 字母 i,该语言标记是在 IANA 显式注册的; 99 | 4. 字母 x,该语言标记是私有的、非标准的,或扩展的子标记。 100 | 101 | ![](imgs/h16-7.png) 102 | 103 | ### 第二个子标记——名字空间 104 | 第二个子标记通常是标准化的国家记号,选自 ISO 3166 中的国家代码和地区标准集合。不过也可以是在 IANA 注册过的其他字符串。 105 | 106 | 如果第二个子标记含有: 107 | 1. 2 个字符,那就是来自 ISO 3166 中定义的国家/地区; 108 | 2. 3~8 个字符,可能是在 IANA 中注册的值; 109 | 3. 单个字符,这是非法情况。 110 | 111 | ![](imgs/h16-8.png) 112 | 113 | ## 国际化的 URI 114 | URI 没有为国际化提供足够的支持,它是由 US-ASCII 字符的一个子集组成的。 115 | 116 | ### URI 字符集合 117 | ![](imgs/h16-9.png) 118 | 119 | ### 转义和反转义 120 | URI 转义提供了一种安全的方式,可以在 URI 内部插入保留字符以及原来不支持的字符(比如空白)。每个转义是一组 3 字符序列,由百分号 % 后面跟上两个十六进制数字的字符。 121 | 122 | 例如插入一个空白可以使用 %20(ASCII 32),如果想插入一个百分号并且不想被转义,就可以输入 %25,百分号的十六进制值是 25。 123 | 124 | ## 其他需要考虑的地方 125 | ### 首部和不合规范的数据 126 | HTTP 首部必须由 US-ASCII 字符集中的字符构成。但有些 HTTP 应用程序使用操作系统和库例程来处理字符,但不是所有的库都支持 ASCII 范围(0~127)之外的字符。 -------------------------------------------------------------------------------- /docs/physical-layer.md: -------------------------------------------------------------------------------- 1 | # 物理层 2 | 数据在通信线路上的传输方式一般是串行传输(出于经济上的考虑),即逐个比特按照顺序传输。 3 | ## 数据通信的基础知识 4 | 数据通信系统可分为三大部分: 5 | 1. 源系统,即发送端。 6 | 2. 传输系统或传输网络。 7 | 3. 目的系统,即接收端。 8 | 9 | ![](../imgs/pl1.png) 10 | 11 | #### 源系统 12 | 源系统一般包括两部分: 13 | 1. 源点(源站、信源),源点设备产生要传输的数据。 14 | 2. 发送器,源点生成的数字比特流要通过发送器编码后才能够在传输系统传输。 15 | 16 | #### 目的系统 17 | 目的系统一般包括两部分: 18 | 1. 接收器,接收传输系统传送过来的信号,并转换为能够被目的设备处理的信息。 19 | 2. 终点,终点设备从接收器获取传过来的数字比特流,然后把信息输出。 20 | 21 | #### 信号 22 | 信号可分为两大类: 23 | 1. 模拟信号或连续信号,代表消息的参数的取值是连续的。 24 | 2. 数字信号或离散信号,代表消息的参数的取值是离散的。在使用时间域的波形表示数字信号时,代表不同离散数值的基本波形被称为码元。 25 | 在使用二进制编码时,只有两种不同的码元,一种状态代表 0,另一种状态代表 1。 26 | 27 | ### 信道 28 | 信道一般用来表示向某一个方向传输信息的媒体。因此,一条通信电路通常包含一条发送信道和接收信道。 29 | 30 | 从通信的双方信息交互的方式来看,有三种基本方式: 31 | 1. 单向通信(单工通信),即只能有一个方向的通信而没有反方向的交互。无线电广播、有线电广播、电视广播就属于这种方式。 32 | 2. 双向交替通信(半双工通信),双方都能发送信息,但同时只能有一个方向的通信。 33 | 3. 双向同时通信(全双工通信),双方能同时发送和接收信息。 34 | 35 | 单向通信只需一个信道,双向交替、双向同时通信都需要两个信道(每个方向一条)。 36 | 37 | #### 基带信号 38 | 来自信源的信号称为基带信号,像计算机输出的信号就属于基带信号。 39 | 基带信号往往含有较多地低频成分,甚至有直流成分,而许多信道不能传输这种低频分量或直流分量,所以需要对基带信号进行**调制**。 40 | 41 | 调制可分为两大类: 42 | 1. 仅对基带信号的波形进行转换,使它与信道特性相适应,变换后的信号仍然是基带信号,称为基带调制,又称为编码。 43 | 2. 需要使用载波进行调制,把基带信号的频率范围转移到较高的频段,并转换为模拟信号,这样能更好地在模拟信道中传输。经载波调制后的信号称为带通信号,而使用载波的调制称为带通调制。 44 | 45 | #### 常用编码方式 46 | 1. 不归零制,正电平代表 1,负电平代表 0。 47 | 2. 归零制,正脉冲代表 1,负脉冲代表 0。 48 | 3. 曼彻斯特编码,位周期中心的向上跳变代表 0,位周期中心的向下跳变代表 1。 49 | 4. 差分曼彻斯特编码,在每一位的中心处始终都有跳变。位开始边界有跳变代表 0,而位开始边界没有足迹代表 1。 50 | 51 | ![](../imgs/pl2.png) 52 | 53 | #### 基本的带通调制方法 54 | 1. 调幅,即载波的振幅随基带数字信号变化。 55 | 2. 调频,即载波的频率随基带数字信号变化。 56 | 3. 调相,即载波的初始相位随基带数字信号变化。 57 | 58 | ![](../imgs/pl3.png) 59 | 60 | ### 信道的极限容量 61 | 信号在信道上传输由于各种原因会导致失真。信道所能通过的频率范围总是有限的,信号中的许多高频分量往往不能通过信道。 62 | 63 | ![](../imgs/pl4.png) 64 | 65 | 限制码元在信道上传输速率的因素:信道能够通过的频率范围和信噪比。 66 | #### 信道能够通过的频率范围 67 | 在接收端收到的信号波形由于传输时受到衰减而失去了码元之间的清晰界限,这种现象称为**码间串扰**。在任何信道中,码元传输的速率是有上限的,传输速率超过上限,就会出现严重的码间串扰问题。如果信道的频宽越宽,能够通过的信号高频分量就越多,那么可以用更高的速率传送码元而不出现码间串扰。 68 | 69 | #### 信噪比 70 | 噪声存在于所有电子设备中(随机产生),噪声会使接收端对码元的判决产生错误(0 认为 1,1 认为 0)。如果信号相对较强,那么噪声的影响相对较小。因此,信噪比很重要。信噪比就是信号的平均功率和噪声的平均功率之比,记为 S/N,并用分贝(DB)作为度量单位。 71 | ``` 72 | 信噪比(db) = 10 * log10(S/N) (db) 73 | ``` 74 | 信道的带宽或信道中的噪声比越大,信息的极限传输速率就越高。 75 | 76 | ## 物理层下面的传输媒体 77 | 传输媒体分为导引型传输媒体和非导引型传输媒体。在导引型传输媒体中,电磁波被导引沿着固体媒体传播;在非导引型传输媒体中,电磁波的传输被称为无线传输。 78 | 79 | ![](../imgs/pl5.png) 80 | 81 | ### 导引型传输媒体 82 | #### 双绞线 83 | 双绞线是最古老也是最常用的传输媒体。 84 | ![](../imgs/pl6.png) 85 | 86 | ![](../imgs/pl7.png) 87 | 88 | #### 同轴电缆 89 | 在局域网早期曾广泛地使用同轴电缆,但随着技术的进步,现在基本上都使用双绞线。目前同轴电缆主要用在有线电视网的居民小区中。 90 | ![](../imgs/pl8.png) 91 | 92 | #### 光缆 93 | 光纤特点: 94 | 1. 传输损耗小,中继距离长,对远距离传输特别经济。 95 | 2. 抗雷电和电磁干扰性能好。 96 | 3. 无串音干扰,保密性好,不易被窃听和截取数据。 97 | 5. 体积小,重量轻。 98 | 6. 通信容量非常大。 99 | 100 | ![](../imgs/pl9.png) 101 | 102 | ![](../imgs/pl10.png) 103 | ### 非导引型传输媒体 104 | #### 短波 105 | 短波通信主要靠电离层反射,但电离层不稳定导致短波通信质量较差。 106 | 107 | #### 微波 108 | 无线电微波通信在数据通信中占有重要地位,微波在空间主要是直线传播。传统的微波通信有两种方式:地面微波接力通信和卫星通信。 109 | 110 | 微波接力通信特点: 111 | 1. 微波波段频率很高,其频段范围也很宽,因此通信信道的容量很大。 112 | 2. 因为工业干扰和天电干扰的主要频谱成分比微波频率低得多,因而微波传输质量较高。 113 | 3. 与相同容量和长度的电缆载波通信比较,微波接力通信建设投资少,见效快,易于跨越山区、江河。 114 | 4. 相邻站之间必须直视,不能有障碍物。 115 | 5. 微波的传播有时也会受恶劣天气的影响。 116 | 6. 与电缆通信系统比较,微波通信的隐蔽性和保密性较差。 117 | 7. 对大量中继站的使用和维护要耗费较多的人力、物力。 118 | 119 | 卫星通信特点: 120 | 1. 利用同步地球卫星作为中继站的一种微波接力通信。 121 | 2. 通信距离远,且通信费用与距离无关。同步地球卫星发射的电磁波能覆盖的区域跨度达一万八千多公里,面积约占地球的三分之一,只要 3 颗卫星就能覆盖全球。 122 | 3. 由于距离远,导致传播时延大。 123 | 4. 保密性相对较差。 124 | 5. 费用较高。 125 | 126 | ## 信道复用技术 127 | ### 频分复用、时分复用和统计时分复用 128 | ![](../imgs/pl11.png) 129 | 130 | 最基本的复用就是频分复用 FDM 和时分复用 TDM。 131 | 132 | 频分复用在用户分配到一定的频带后,在通信过程中自始至终都占用这个频带。可见频分复用的用户在同样的时间占用不同的带宽(频率带宽)资源。 133 | 134 | 时分复用是将时间划分为一段段等长的时分复用帧,每一个用户在每一个 TDM 帧中占用固定序号的时隙。时分复用的用户是在不同的时间占用同样的频带带宽。 135 | 136 | ![](../imgs/pl12.png) 137 | 138 | 统计时分复用是一种改进的时分复用,它能明显地提高信道的利用率。 139 | 140 | ![](../imgs/pl13.png) 141 | 142 | ![](../imgs/pl14.png) 143 | 144 | ### 波分复用 145 | 波分复用 WDM 就是光的频分复用。 146 | 147 | ![](../imgs/pl15.png) -------------------------------------------------------------------------------- /docs/http/3.md: -------------------------------------------------------------------------------- 1 | # HTTP 报文 2 | ## 报文流 3 | HTTP 使用术语**流入**和**流出**来描述事务处理的方向。 4 | 5 | ![](imgs/h3-1.png) 6 | 7 | HTTP 报文会像河水一样向下游流动,不管是请求报文还是响应报文,所有报文的发送者都在接收者的上游。 8 | 9 | ![](imgs/h3-2.png) 10 | 11 | ## 报文的组成 12 | 起始行和首部就是由行分隔的 ASCII 文本。每行以一个由两个字符组成的行终止序列作为结束,其中包括一个回车符(ASCII 码 13)和换行符(ASCII 码 10)。 13 | 这个行终止序列可写做 CRLF。 14 | 15 | 报文主体是一个可选的数据块,可以为空也可以包含二进制数据。 16 | 17 | ### 报文的语法 18 | 请求和响应报文结构基本相同。 19 | 20 | ![](imgs/h3-3.png) 21 | 22 | 1. 方法,客户端希望服务器对资源执行的动作。 23 | 2. 请求 URL,命名了所请求的资源。 24 | 3. 版本,报文所使用的 HTTP 版本。 25 | 4. 状态码,这三位数字描述了请求过程中所发生的情况。 26 | 5. 原因短语,数字状态码的可读版本,包含行终止序列之前的所有文本。 27 | 6. 首部,可以有零或多个首部。 28 | 7. 实体的主体部分,可以为空也可以包含二进制数据。 29 | 30 | ![](imgs/h1-2.png) 31 | 32 | ![](imgs/h3-4.png) 33 | 34 | #### 首部分类 35 | 1. 通用首部,可以出现在请求或响应报文中。 36 | 2. 请求首部,提供更多有关请求的信息。 37 | 3. 响应首部,提供更多有关响应的信息。 38 | 4. 实体首部,描述主体的长度和内容,或者资源自身。 39 | 5. 扩展首部,规范中没有定义的新首部。 40 | 41 | ![](imgs/h3-5.png) 42 | 43 | ## 方法 44 | ### GET 和 HEAD 45 | HTTP 的 GET 和 HEAD 方法被称为安全方法,使用这两个方法的 HTTP 请求不会产生什么动作。 46 | 47 | HEAD 方法和 GET 方法很类似,但服务器在响应中只返回首部。这就允许客户端在未获取实际资源的情况下,对资源的首部进行检查。使用 HEAD,可以: 48 | 1. 在不获取资源的情况下了解资源的情况。 49 | 2. 通过查看响应状态码,看看某个对象是否存在。 50 | 3. 通过查看首部,了解测试资源是否被修改了。 51 | 52 | 服务器开发者必须确保返回的首部与 GET 请求所返回的首部完全相同。遵循 HTTP/1.1 规范,就必须实现 HEAD 方法。 53 | 54 | ### PUT 55 | 与 GET 方法从服务器读取文档相反,PUT 方法会向服务器写入文档。PUT 方法的语义就是让服务器用请求的主体部分来创建一个由所请求的 URL 命名的新文档。 56 | 如果那个文档已存在,就覆盖它。因为 PUT 允许用户对内容进行修改,所以服务器要求在执行 PUT 之前,要用密码登录。 57 | 58 | ### POST 59 | POST 方法通常用来向服务器发送表单数据。 60 | 61 | ### TRACE 62 | 客户端发起一个请求时,这个请求可能要穿过路由器、防火墙、代理、网关等。每个中间节点都可能会修改原始的 HTTP 请求,TRACE 方法允许客户端在最终发起请求时,看看它变成了什么样子。 63 | 64 | TRACE 请求会在目的服务器端发起一个“环回”诊断。行程最后一站的服务器会弹回一条 TRACE 响应,并在响应主体中携带它收到的原始请求报文。 65 | 这样客户端就可以查看在所有中间 HTTP 应用程序组成的请求/响应链上,原始报文是否被毁坏或修改过。 66 | 67 | ![](imgs/h3-6.png) 68 | 69 | TRACE 方法主要用于诊断,用于验证请求是否如愿穿过了请求/响应链。它也是一种工具,用来查看代理和其他应用程序对用户请求所产生的效果。 70 | TRACE 请求中不能带有实体的主体部分。TRACE 响应的实体主体部分包含了响应服务器收到的请求的精确副本。 71 | 72 | ### OPTIONS 73 | OPTIONS 方法请求 Web 服务器告知其支持的各种功能。 74 | 75 | ### DELETE 76 | DELETE 方法就是让服务器删除请求 URL 所指定的资源。 77 | 78 | ## 状态码 79 | ### 100~199 信息性状态码 80 | HTTP/1.1 向协议中引入了信息性状态码。 81 | 82 | ### 200~299 成功状态码 83 | ![](imgs/h3-7.png) 84 | 85 | ### 300~399 重定向状态码 86 | 重定向状态码要么告诉客户端使用替代位置来访问他们感兴趣的资源,要么提供一个替代的响应而不是资源的内容。 87 | 如果资源已被移动,可以发送一个重定向状态码和一个可选的 Location 首部来告知客户端资源已被移走,以及现在在哪里可以找到它。这样,浏览器可以在不打扰使用者的情况下,透明地转入新的位置。 88 | 89 | ![](imgs/h3-8.png) 90 | 91 | ![](imgs/h3-9.png) 92 | 93 | ### 400~499 客户端错误状态码 94 | 有时客户端会发送一些服务器无法处理的东西,例如格式错误的请求报文、一个不存在的 URL。 95 | 96 | ![](imgs/h3-10.png) 97 | 98 | ![](imgs/h3-11.png) 99 | ### 500~599 服务器错误状态码 100 | 有时客户端发送了一条有效请求,服务器自身却出错了。 101 | 102 | ![](imgs/h3-12.png) 103 | 104 | ## 首部 105 | 首部和方法共同配合工作,决定了客户端和服务器能做什么事情。 106 | ### 通用首部 107 | 有些首部提供了与报文相关的最基本信息,它们被称为通用首部。 108 | 109 | ![](imgs/h3-13.png) 110 | 111 | HTTP/1.0 引入了允许 HTTP 应用程序缓存对象本地副本的首部,这样就不用总是从服务器获取资源了。 112 | 113 | ![](imgs/h3-14.png) 114 | ### 请求首部 115 | 请求首部是只在请求报文中有意义的首部,用于说明请求的详情。 116 | 117 | ![](imgs/h3-15.png) 118 | 119 | #### Accept 首部 120 | Accept 告诉服务器用户代理能够处理的媒体类型及媒体类型的相对优先级。 121 | 122 | ![](imgs/h3-16.png) 123 | 124 | #### 条件请求首部 125 | 通过条件请求首部,客户端可以要求服务器在对请求进行响应之前,确保某个条件为真。 126 | 127 | ![](imgs/h3-17.png) 128 | 129 | #### 安全请求首部 130 | HTTP 本身支持一种简单的机制,可以对请求进行质询/响应认证。这种机制要求客户端在获取资源之前,先对自身进行认证。 131 | 132 | ![](imgs/h3-18.png) 133 | 134 | #### 代理请求首部 135 | ![](imgs/h3-19.png) 136 | 137 | ### 响应首部 138 | 响应首部为客户端提供了一些额外的信息。 139 | 140 | ![](imgs/h3-20.png) 141 | 142 | #### 协商首部 143 | 如果资源有多种表示方式,HTTP/1.1 可以为服务器和客户端提供对资源进行协商的能力。 144 | 145 | ![](imgs/h3-21.png) 146 | 147 | #### 安全响应首部 148 | 安全响应首部是 HTTP 的质询/响应认证机制的响应侧。 149 | 150 | ![](imgs/h3-22.png) 151 | 152 | ### 实体首部 153 | 实体首部提供了有关实体及其内容的大量信息,从有关对象类型的信息,到能够对资源使用的各种有效的请求方法。 154 | 155 | ![](imgs/h3-23.png) 156 | 157 | #### 内容首部 158 | 内容首部提供了与实体内容有关的特定信息,说明了其类型、尺寸以及处理它所需的其他有用信息。 159 | 160 | ![](imgs/h3-24.png) 161 | 162 | #### 实体缓存首部 163 | 通用的缓存首部说明了如何或什么时候进行缓存。实体的缓存首部提供了与被缓存实体有关的信息。 164 | 165 | ![](imgs/h3-25.png) -------------------------------------------------------------------------------- /docs/http/6.md: -------------------------------------------------------------------------------- 1 | # 代理 2 | 代理位于客户端和服务器之间,扮演“中间人”的角色,在各端点之间来回传送 HTTP 报文。 3 | ## Web 的中间实体 4 | ![](imgs/h6-1.png) 5 | 6 | ### 代理与网关的对比 7 | 代理连接的是多个使用相同协议的程序,而网关连接的是多个使用不同协议的端点。网关扮演的是“协议转换器”的角色,即使客户端和服务器使用的是不同的协议,客户端也可以通过它完成与服务器之间的事务处理。 8 | 9 | ![](imgs/h6-2.png) 10 | 11 | 实际上,代理和网关的区别很模糊,由于浏览器和服务器实现的是不同版本的 HTTP,代理也经常要做一些转换协议的工作。 12 | 13 | ## 为什么使用代理 14 | 代理服务器可以改善安全性、提高性能、节省费用,还可以监视流量并对其进行修改。这里列举一些功能: 15 | 1. 过滤器,过滤一些不允许访问的内容,例如成人网站。 16 | 2. 文档访问控制,针对不同的用户创建不同的访问控制策略。 17 | 3. 安全防火墙,代理服务器可以限制某些应用层协议的数据流入或流出。 18 | 19 | ![](imgs/h6-3.png) 20 | 21 | 4. Web 缓存,代理缓存了常用文档的本地副本,并将它们按需提供,以减少缓存且昂贵的通信。 22 | 5. 反向代理,代理可以假扮服务器。反向代理接收请求,然后发给其他真正处理请求的服务器,最后把结果转发回给客户端。可以用这些反向代理来提高访问慢速服务器上公共内容时的性能,在这种情况下,反向代理可称为服务器加速器。 23 | 6. 内容路由器,代理可作为内容路由器使用。根据因特网流量状况以及内容类型将请求导向特定的服务器。 24 | 7. 转码器,代理服务器在将内容发给客户端之前,可以修改内容的主体格式。在这些数据之间进行的透明转换被称为转码。例如在传输 GIF 图片时,将其转换为 JPEG 图片,以减小尺寸。 25 | 8. 匿名者,匿名者代理会主动从 HTTP 报文中删去身份特性(例如客户端的 IP 地址、From 首部、Referer 首部、cookie),从而提供高度的私密性和匿名性。 26 | 27 | ## 代理会去向何处 28 | ### 代理服务器的部署 29 | 可以根据其目标用途,将代理放在任意位置: 30 | 1. 出口代理,将代理固定在本地网络的出口点,以便控制本地网络与因特网之间的流量。 31 | 2. 访问(入口)代理,代理常被放在 ISP 访问点上,用以处理来自客户的聚合请求。 32 | 3. 反向代理,反向代理通常被部署在网络边缘,在那里它们可以处理所有传送给服务器的请求,并只在必要时向服务器请求资源。反向代理通常会冒用服务器的名称和 IP 地址,这样所有的请求都会发给反向代理而不是服务器。 33 | 4. 网络交换代理,可以将具有足够处理能力的代理放在网络之间的因特网对等交换点上,通过缓存来减轻因特网节点的拥塞,并对流量进行监视。 34 | 35 | ![](imgs/h6-4.png) 36 | 37 | ### 代理的层次结构 38 | 可以通过代理层次结构将代理级联起来。下一个入口代理(靠近服务器)被称为父代理,下一个出口代理(靠近客户端)被称为子代理。 39 | 40 | ![](imgs/h6-5.png) 41 | 42 | 上图中代理的层次结构是静态的——代理 1 总是把报文传给代理 2,代理 2 总是把报文传给代理 3。但是,层次也可以是动态的。代理可以根据不同的因素,将报文传给一个不断变化的代理服务器和原始服务器集。 43 | 44 | ![](imgs/h6-6.png) 45 | 46 | 这里还有几个动态选择父代理的例子: 47 | 1. 负载均衡,子代理根据当前父代理上的工作负载级别来决定如何选择一个父代理,以均衡负载。 48 | 2. 地理位置附近的路由,子代理可能会选择负责原始服务器所在物理区域的父代理。 49 | 3. 协议/类型路由,子代理可能会根据 URI 将报文转发到不同的父代理和原始服务器上去。 50 | 4. 基于订购的路由,如果发布者为高性能服务额外付费了,它们的 URI 就会被转发到大型缓存或压缩引擎上去,以提高性能。 51 | 52 | ### 代理如何获取流量 53 | 有四种常见的方式可以使客户端流量流向代理: 54 | 1. 修改客户端,很多浏览器可以配置代理,如果将客户端配置为使用代理服务器,客户端就会将 HTTP 请求直接地发送给代理而不是服务器。 55 | 2. 修改网络,网络基础设施可以通过技术手段将 HTTP 流量导入到一个代理。这种代理被称为拦截代理。 56 | 3. 修改 DNS 的命名空间。 57 | 4. 修改服务器,可以将某些服务器配置为向客户端发送一个 HTTP 重定向命令,将客户端请求重定向到一个代理上去。 58 | 59 | ![](imgs/h6-7.png) 60 | 61 | ## 客户端的代理设置 62 | 浏览器配置代理方式: 63 | 1. 手工配置,显式地设置要使用的代理。 64 | 2. 预先配置浏览器,浏览器厂商或发行商预先对浏览器的代理设置进行手工配置。 65 | 3. 代理的自动配置,提供一个指向 JS 语言编写的代理自动配置文件的 URI,客户端会取回这个文件,运行并决定是否使用一个代理。 66 | 4. WPAD 的代理发现,有些浏览器支持 Web 代理自动发现协议。 67 | 68 | ### 客户端代理配置:PAC 文件 69 | PAC 文件是一些小型的 JS 程序,可以在运行过程中计算代理设置。访问每个文档时,JS 函数都会选择恰当的代理服务器。 70 | 每个 PAC 文件都得定义一个叫 `FindProxyForURL(url, host)` 的函数,用来计算访问 URI 时使用的适当的代理服务器。返回值可以是下表列出的任意值。 71 | 72 | ![](imgs/h6-8.png) 73 | 74 | ### 客户端代理配置:WPAD 文件 75 | 有些浏览器的配置机制是 WPAD 协议,WPAD 协议会自动地寻找 PAC 文件。 76 | 77 | ## 与代理请求有关的一些棘手问题 78 | ### 代理 URI 和服务器 URI 的不同 79 | 客户端向服务器而不是代理发送请求时,HTTP 请求报文中的 URI 会有所不同。 80 | 客户端向服务器发送请求时,请求行中只包含部分 URI(没有方案、主机、端口),如下例所示: 81 | ``` 82 | GET /index.html HTTP/1.0 83 | User-Agent: SuperBrowser v1.3 84 | ``` 85 | 但当客户端向代理发送请求时,请求行中则包含完全的 URI: 86 | ``` 87 | GET http:/test.com/index.html HTTP/1.0 88 | User-Agent: SuperBrowser v1.3 89 | ``` 90 | 因为在原始的设计中,客户端和服务器直接进行对话,不存在代理。所以为了避免冗余信息,客户端只需发送部分 URI 即可,无需方案、主机、端口。 91 | 代理出现之后,使用部分 URI 就有问题了。代理需要知道目标服务器的名称,这样它才能与服务器建立连接。 92 | 93 | ![](imgs/h6-9.png) 94 | 95 | ### 代理既可以处理代理请求,也可以处理服务器请求 96 | ![](imgs/h6-10.png) 97 | 98 | ## 追踪报文 99 | ### Via 100 | Via 是一个通用首部,是由代理服务器添加的,适用于正向和反向代理,在请求和响应首部中均可出现。这个消息首部可以用来追踪消息转发情况,防止循环请求,以及识别在请求或响应传递链中消息发送者对于协议的支持能力。 101 | 102 | Via 字段: 103 | 1. 协议名,如果协议名是 HTTP ,那就是可选的,否则就要在版本前面加上协议名,中间用 “/” 分隔。 104 | 2. 协议版本 105 | 3. 节点名 106 | 4. 节点注释 107 | 108 | ### TRACE 方法 109 | HTTP/1.1 的 TRACE 方法可以跟踪经代理链传输的请求报文,观察报文经过了哪些代理,以及每个代理是如何对请求报文进行修改的。TRACE 对代理流的调试非常有用。 110 | 当 TRACE 请求到达目的服务器时,整条请求报文都会被封装在一条 HTTP 响应报文的主体中回送给发送端。TRACE 响应的 Content-Type 为 message/http,状态为 200 OK,代理列表在 Via 首部可以看到。 111 | 112 | ![](imgs/h6-11.png) 113 | 114 | #### Max-Forwards 115 | Max-Forwards 首部用来限制 TRACE 和 OPTIONS 请求所经过的代理跳数。如果值为 0,那么接收者即使不是原始服务器也要把 TRACE 报文回送给客户端。 116 | 117 | ## 代理认证 118 | HTTP 定义了一种名为代理认证的机制,这种机制可以阻止对内容的请求,直到用户向代理提供了有效的访问权限证书为止。 119 | 120 | ![](imgs/h6-12.png) 121 | 122 | ## 代理的互操作性 123 | ### 处理代理不支持的首部和方法 124 | 代理服务器可能无法理解所有经其传输的首部字段,代理必须对不认识的首部字段进行转发,必须维持同名首部字段的相对顺序。 125 | 126 | ### OPTIONS:发现对可选特性的支持 127 | 通过 HTTP OPTIONS 方法,客户端可以检查服务器是否支持某个功能。客户端在与服务器建立连接之前,通过使用 OPTIONS 可以确定服务器的能力。 128 | 这样它就可以更方便地与不同特性的代理和服务器进行互操作了。 129 | 130 | ![](imgs/h6-13.png) 131 | 132 | 如果 OPTIONS 请求的 URI 是个星号(*),请求的就是整个服务器所支持的功能。 133 | ``` 134 | OPTIONS * HTTP/1.1 135 | ``` 136 | 如果 URL 是个实际资源地址,请求的就是在查询那个特定资源的可用特性。 137 | ``` 138 | OPTIONS http://test.com HTTP/1.1 139 | ``` 140 | 如果成功,OPTIONS 方法就会返回一个包含了各种首部字段的 200 OK 响应,这些字段是服务器所支持的,或资源可用的各种可选特性。 141 | HTTP/1.1 在响应中唯一指定的首部字段是 Allow 首部,这个首部用于描述服务器所支持的各种方法(或者服务器上的特定资源)。 142 | 143 | ### Allow 首部 144 | Allow 实体首部字段列出了请求 URI 标识的资源所支持的方法列表,如果 URI 为 * 的话,列出的就是整个服务器所支持的方法列表。如: 145 | ``` 146 | Allow: GET, HEAD, PUT 147 | ``` -------------------------------------------------------------------------------- /docs/http/7.md: -------------------------------------------------------------------------------- 1 | # 缓存 2 | 使用缓存的优点: 3 | 1. 缓存减少了冗余的数据传输,节省了你的网络费用。 4 | 2. 缓存缓解了网络瓶颈的问题,不需要更多的带宽就能够更快地加载页面。 5 | 3. 缓存降低了对原始服务器的要求,服务器可以更快地响应,避免过载的出现。 6 | 4. 缓存降低了距离时延,因为从较远的地方加载页面会更慢一些。 7 | 8 | ## 缓存命中 9 | 如果请求的资源在缓存能够找到,就称为缓存命中;如果没有,就称为缓存未命中。 10 | 11 | ### 再验证 12 | 原始服务器的内容可能会发生变化,缓存要不时对其进行检测,看看保存的副本是否仍是服务器上最新的副本。这些“新鲜度检测”称为 HTTP 再验证。 13 | 大部分的缓存只有在客户端发起请求,并且副本旧得足以需要检测的时候,才会对副本进行再验证。 14 | 15 | 缓存对副本进行再验证时,会向服务器发送一个小的再验证请求。如果内容没有变化,服务器会返回一个小的 304 Not Modified 进行响应,这称为再验证命中。 16 | HTTP 提供了几个用来对缓存对象进行再验证的工具,但最常用的是 If-Modified-Sice 首部。 17 | 18 | >If-Modified-Since 是一个条件式请求首部,服务器只在所请求的资源在给定的日期时间之后对内容进行过修改的情况下才会将资源返回,状态码为 200 。如果请求的资源从那时起未经修改,那么返回一个不带有消息主体的 304 响应,而在 Last-Modified 首部中会带有上次修改时间。 不同于 If-Unmodified-Since, If-Modified-Since 只可以用在 GET 或 HEAD 请求中。 19 | >当与 If-None-Match 一同出现时,它(If-Modified-Since)会被忽略掉,除非服务器不支持 If-None-Match。 20 | >最常见的应用场景是来更新没有特定 ETag 标签的缓存实体。 21 | 22 | 语法 23 | ``` 24 | If-Modified-Since: , :: GMT 25 | ``` 26 | 27 | ### 命中率 28 | 由缓存提供服务的请求所占的比例称为**缓存命中率**。 29 | 30 | **字节命中率**表示的是缓存提供的字节在传输的所有字节中所占的比例。 31 | 32 | 客户端有一种方法可以判断响应是否来自缓存,就是使用 Date 首部。将响应中的 Date 首部的值与当前时间进行比较,如果响应中的日期值比较早,通常可以认为这是一条缓存的响应。 33 | 34 | ## 缓存的拓扑结构 35 | ### 代理缓存的拓扑结构 36 | 在实际中,实现层次化的缓存是很有意义的。在这种结构中,在较小缓存中未命中的请求会被导向较大的父缓存。 37 | 38 | ![](imgs/h7-1.png) 39 | 40 | 在层次结构很深的情况下,请求可能要穿过很长一溜缓存,每个拦截代理都会添加一些性能损耗,当代理链过长时,这种损耗会变得非常明显。 41 | 42 | ### 网状缓存、内容路由以及对等缓存 43 | 网状缓存中的代理缓存之间会以更复杂的方式进行对话,这种代理缓存会决定选择何种路由对内容进行访问、管理和传送,因此可将其称为**内容路由器**。 44 | 45 | 网状缓存中为内容路由设计的缓存功能: 46 | 1. 根据 URL 在父缓存或原始服务器之间进行动态选择。 47 | 2. 根据 URL 动态地选择一个特定的父缓存。 48 | 3. 前往父缓存之前,在本地缓存中搜索已缓存的副本。 49 | 4. 允许其他缓存对其缓存的部分内容进行访问,但不允许因特网流量通过它们的缓存。 50 | 51 | 缓存之间允许不同的组织互为对等实体,将它们的缓存连接起来以实现共赢。提供对等支持的缓存被称为兄弟缓存,HTTP 不支持兄弟缓存,需要通过一些协议进行扩展,例如因特网缓存协议 ICP 和超文本缓存协议 HTCP。 52 | 53 | ![](imgs/h7-2.png) 54 | 55 | ## 缓存的处理步骤 56 | 1. 接收——缓存从网络中读取抵达的请求报文。 57 | 2. 解析——缓存对报文进行解析,提取出 URL 和各种首部。 58 | 3. 查询——缓存查看是否有本地副本可用,如果没有,就获取一份副本并保存在本地。 59 | 4. 新鲜度检测——缓存查看已缓存副本是否足够新鲜,如果不是,就向服务器询问是否有更新。 60 | 5. 创建响应——缓存会用新的首部和已缓存的主体来构建一条响应报文。 61 | 6. 发送——缓存通过网络将响应发回给客户端。 62 | 7. 日志——缓存可选地创建一个日志文件条目来描述这个事务。 63 | 64 | ![](imgs/h7-3.png) 65 | 66 | ![](imgs/h7-4.png) 67 | 68 | HTTP 有一些简单的机制可以在不要求服务器记住有哪些缓存的情况下,保持已缓存数据和服务器数据一致。这些机制分别称为**文档过期**和**服务器再验证**。 69 | 70 | ## 保持副本的新鲜 71 | ### 文档过期 72 | 通过 HTTP 的 Cache-Control 首部和 Expires 首部,HTTP 让原始服务器向每个文档附加一个“过期日期”。 73 | 74 | 在缓存文档过期前,缓存可以随意使用文档而不用和服务器联系,除非客户端请求中包含有阻止提供已缓存或未验证资源的首部。如果缓存文档过期,缓存就必须与服务器进行核对,询问文档是否被修改,如果被修改过,就获取一份新的副本。 75 | 76 | ### 过期日期和使用期 77 | ![](imgs/h7-5.png) 78 | 79 | Cache-Control: max-age 和 Expires 首部做的事本质上是一样的,只是 Cache-Control 使用的是相对时间不是绝对日期。 80 | 81 | ### 服务器再验证 82 | 缓存到期了就要和服务器核对原始文档是否发生了变化,这称为服务器再验证。 83 | 84 | 如果再验证显示内容发生了变化,缓存就会获取一份新副本并保存在本地,然后将文档返回给客户端。 85 | 如果再验证显示内容没有变化,缓存只需获取新的首部,包括一个新的过期日期,并对缓存中的首部进行更新。 86 | 87 | ### 用条件方法进行再验证 88 | HTTP 定义了 5 个条件请求首部,对缓存再验证最有用的两个首部是 If-Modified-Since 和 If-None-Match。所有的条件首部都以 If 开头。 89 | 90 | ![](imgs/h7-6.png) 91 | 92 | ### If-Modified-Since:Date 再验证 93 | 如果自指定日期后,文档被修改了,If-Modified-Since 条件就为真。携带新首部的新文档会返回给缓存,还包含了一个新的过期日期。 94 | 如果文档没有被修改,If-Modified-Since 条件就为假,则给客户端返回一个不包含主体的 304 Not Modified 响应报文。 95 | 96 | If-Modified-Since 首部可以和 Last-Modified 服务器响应首部配合工作。服务器会将最后的修改日期附加到所提供的文档上去,当缓存要对已缓存文档进行再验证时,就会包含一个 If-Modified-Since 首部,其中携带有已缓存副本的最后修改日期。 97 | ``` 98 | If-Modified-Since: 99 | ``` 100 | 如果在此日期后内容被修改了,服务器就会返回新的文档。否则,缓存的最后修改日期和服务器当前文档的最后修改日期相符,就会返回一个 304 Not Modified 响应报文。 101 | 102 | ### If-None-Match: 实体标签再验证 103 | 有些情况下仅使用最后日期进行再验证是不够的。有些文档可能会被周期性地重写,内容没有发生变化,但修改日期变了。 104 | 105 | HTTP 允许用户对被称为实体标签(ETag)的版本标识符进行比较。实体标签是附加到文档上的任意标签,可能是版本号、序列号或其他内容。 106 | 如果实体标签被修改了,缓存就可以使用 If-None-Match 条件首部来 GET 文档的新副本了。 107 | 108 | ![](imgs/h7-7.png) 109 | 110 | ### 什么时候应该使用实体标签和最近修改日期 111 | 如果服务器回送了一个实体标签,HTTP/1.1 客户端就必须使用实体标签验证器。如果服务器只回送了一个 Last-Modified 值,客户端就可以使用 If-Modified-Since 验证。 112 | 如果实体标签和最近修改日期都返回了,客户端就应该使用这两种再验证方案。只有这两个条件都满足时,代理或服务器才能返回 304 Not Modified。 113 | 114 | ## 控制缓存的能力 115 | 服务器可以通过 HTTP 定义的几种方式来控制缓存时长,按照优先级递减方式排序,有以下几种方式: 116 | 1. Cache-Control: no-store 首部。 117 | 2. Cache-Control: no-cache 首部。 118 | 3. Cache-Control: must-revalidate 首部。 119 | 4. Cache-Control: max-age 首部。 120 | 5. Expires。 121 | 6. 不附加过期信息,让缓存确定自己的过期日期。 122 | 123 | ### no-store 和 no-cache 响应首部 124 | 标识为 no-store 的响应会禁止缓存对响应进行复制,然后缓存向客户端转发一条 no-store 响应并删除对象。 125 | 126 | 标识为 no-cache 的响应是可以存储在本地缓存区的,只是在与服务器进行新鲜度再验证之前,缓存不能将其提供给客户端使用。 127 | 128 | ### max-age 响应首部 129 | 设置缓存存储的最大周期,超过这个时间缓存被认为过期(单位秒)。与Expires相反,时间是相对于请求的时间。 130 | 131 | ### Expires 响应首部 132 | 不推荐使用 Expires 响应首部,它指定的是实际的日期而不是秒数。 133 | 134 | ### must-revalidate 响应首部 135 | must-revalidate 响应首部告诉缓存,在事先没有跟服务器进行再验证的情况下,不能提供这个对象的陈旧副本。 136 | 如果缓存在进行 must-revalidate 新鲜度检查时,服务器不可用,缓存就必须返回一条 504 Gateway Timeout 错误。 137 | 138 | ### 客户端的新鲜度限制 139 | 客户端可以通过 Cache-Control 请求首部来强化或放松对过期时间的限制。 140 | 141 | ![](imgs/h7-8.png) 142 | -------------------------------------------------------------------------------- /docs/http/15.md: -------------------------------------------------------------------------------- 1 | # 实体和编码 2 | HTTP 要确保它所承载的“货物”满足以下条件: 3 | 1. 可以被正确地识别(通过 Content-Type 首部说明数据格式,Content-Language 首部说明语言)。 4 | 2. 可以被正确地解包(通过 Content-Length 首部和 Content-Encoding 首部)。 5 | 3. 是最新的(通过实体验证码和缓存过期控制)。 6 | 4. 符合用户的需要(基于 Accept 系列的内容协商首部)。 7 | 5. 在网络上可以快速有效地传输(通过范围请求、差异编码以及其他数据压缩方法)。 8 | 6. 完整到达、未被篡改(通过传输编码首部和 Content-MD5 校验和首部)。 9 | 10 | 为了实现这些目标,HTTP 使用了完善的标签来描述承载内容的实体。 11 | 12 | ## 报文是箱子,实体是货物 13 | ![](imgs/h15-1.png) 14 | 15 | ### 实体首部 16 | HTTP 实体首部描述了 HTTP 报文的内容,HTTP/1.1 定义了 10 个基本实体首部字段。 17 | 18 | ![](imgs/h15-2.png) 19 | 20 | ![](imgs/h15-3.png) 21 | 22 | ### 实体主体 23 | 实体主体中就是数据了,其他描述性的信息都包含在首部中。实体主体只是数据,它需要实体首部来描述数据的意义。 24 | 首部字段以一个空白的 CRLF 行结束,随后就是实体主体的内容。 25 | 26 | ![](imgs/h15-4.png) 27 | 28 | ## Content-Length: 实体的大小 29 | Content-Length 指的是实体主体的字节大小。除非使用了分块编码,否则 Content-Length 首部就是带有实体主体的报文必须使用的。 30 | 使用 Content-Length 首部是为了能够检测出服务器崩溃而导致的报文截尾,并对共享持久连接的多个报文进行正确分段。 31 | 32 | ### 检测截尾 33 | HTTP 的早期版本采用关闭连接的方式来划定报文的结束。但是,没有 Content-Length 的话,客户端就无法确定到底是报文结束时正常的关闭连接,还是报文传输中由于服务器崩溃而导致的连接关闭。客户端要通过检测 Content-Length 来检测报文截尾。 34 | 35 | 缓存代理服务器通常不会缓存没有 Content-Length 首部的 HTTP 报文,以此来减小缓存已截尾报文的风险。 36 | 37 | 如果不能正确识别报文长度,就有可能获取不完整的内容从而导致错误发生。 38 | 39 | 40 | ### Content-Length 与持久连接 41 | 因为连接是持久的,客户端无法依赖连接关闭来判别报文的结束。那就需要 Content-Length 来确定一条报文在哪结束,下一条报文在哪开始。 42 | 有一种情况例外,就是采用分块编码。在分块编码情况下,数据是分为一系列的块来发送的,每块都有大小说明。 43 | 哪怕服务器在生成首部的时候不知道整个实体的大小(通常是因为实体是动态生成的),仍然可以使用分块编码传输若干已知大小的块。 44 | 45 | ### 内容编码 46 | HTTP 允许对实体主体的内容进行编码,比如使之更安全或进行压缩。在这种情况下,Content-Length 首部说明的是编码后的主体的字节长度。 47 | 48 | ### 确定实体主体长度的原则 49 | 下列计算实体主体长度的规则,按顺序匹配,谁先匹配就用谁: 50 | 51 | ![](imgs/h15-5.png) 52 | 53 | HTTP/1.1 规范中建议对于带有主体但没有 Content-Length 首部的请求,服务器应当发送 400 Bad Request 响应或 411 Length Required 响应,后一种情况表明服务器要求收到正确的 Content-Length 首部。 54 | 55 | ## 实体摘要 56 | 为检测实体主体的数据是否被修改,发送方可以在生成主体时,生成一个数据的检验和,这样接收方可以通过检验这个校验和来检查实体是否被修改了。 57 | 58 | 服务器使用 Content-MD5 首部来发送对实体主体运行 MD5 算法的结果。只有产生响应的原始服务器才能发送 Content-MD5 首部。中间代理和缓存都不应当修改或添加这个首部。 59 | 60 | 除了检查报文完整性之外,MD5 还可以做散列表的关键字,用来快速定位文档。 61 | 62 | 除了这些可能的用法,一般不常用到 Content-MD5 首部。 63 | 64 | ## 媒体类型和字符集 65 | Content-Type 首部字段说明了实体主体的 MIME 类型。MIME 类型由一个主媒体类型后面跟一条斜线以及一个子类型组成。 66 | 67 | ![](imgs/h15-6.png) 68 | 69 | Content-Type 首部还支持可选的参数来进一步说明内容的类型。charset 参数就是个例子,它说明把实体中的比特转换为文本文件中的字符的方法: 70 | ``` 71 | Content-Type: text/html; charset=iso-8859-4 72 | ``` 73 | 74 | MIME 中的 multipart(多部分) 电子邮件报文中包含多个报文,它们合在一起作为单一的复杂报文发送。每一部分都是独立的,有各自的描述其内容的集。 75 | 76 | HTTP 也支持多部分主体。不过,通常只用在两种情形: 77 | 1. 提交填写好的表单; 78 | 2. 作为承载若干文档片段的范围响应。 79 | 80 | ### 多部分表格提交 81 | 当提交填写的 HTTP 表单时,文本字段和上传的对象都作为多部分主体里面独立的部分发送。 82 | HTTP 使用 Content-Type: multipart/form-data 或 Content-Type: multipart/mixed 这样的首部以及多部分主体来发送这种请求。 83 | ``` 84 | Content-Type: multipart/form-data; boundary=[abcdefghijklmnopqrstuvwxyz] 85 | ``` 86 | 其中的 boundary 参数说明了分割主体中不同部分所用的字符串。 87 | 88 | ### 多部分范围响应 89 | HTTP 对范围请求的响应也可以是多部分的。这样的响应中有 Content-Type: multipart/byteranges 首部和带有不同范围的多部分主体。 90 | 91 | ## 内容编码 92 | ### 内容编码过程 93 | ![](imgs/h15-7.png) 94 | 95 | ### 内容编码类型 96 | Content-Encoding 首部说明了编码时使用的算法: 97 | 98 | ![](imgs/h15-8.png) 99 | 100 | ### Accept-Encoding 首部 101 | 为了避免服务器使用客户端不支持的编码方式,客户端把自己支持的内容编码方式列表放在请求的 Accept-Encoding 首部里发出去。 102 | 如果 HTTP 请求中没有包含 Accept-Encoding 首部,服务器就假设客户端能够接受任何的编码方式(等价于 Accept-Encoding: *)。 103 | 104 | 客户端可以给每种编码附带 Q(质量)值参数来说明编码的优先级(0.0-1.0)。0.0 说明客户端不想接受所说明的编码,1.0 则表明最希望使用的编码。 105 | 106 | ## 传输编码和分块编码 107 | 使用传输编码是为了改变报文中的数据在网络上传输的方式。 108 | 109 | ![](imgs/h15-9.png) 110 | 111 | ### 可靠传输 112 | 在 HTTP 中,只有少数情况下会出现所传输的报文主体有问题。其中两种情况如下: 113 | 1. 未知的尺寸; 114 | 2. 安全性。 115 | 116 | ### Transfer-Encoding 首部 117 | HTTP 协议只定义了两个首部来描述和控制传输编码: 118 | 1. Transfer-Encoding,告知接收方为了可靠地传输报文,已经对其进行了何种编码; 119 | 2. TE,用在请求首部中,告知服务器可以使用哪些传输编码扩展。 120 | 121 | ![](imgs/h15-10.png) 122 | 123 | ### 分块编码 124 | 分块编码把报文分割成若干个大小已知的块,块之间是紧挨着发送的,这样就不需要在发送之前知道整个报文的大小了。 125 | 126 | 分块编码是一种传输编码,是报文的属性,而不是主体的属性。之前讨论的多部分编码就是主体的属性,它和分块编码是独立的。 127 | 128 | #### 分块与持久连接 129 | 如果客户端和服务器之间不是持久连接,那客户端不需要知道响应报文的实体主体长度。但如果是持久连接,就需要知道响应报文的实体主体长度。 130 | 131 | 分块编码为这种困难提供了解决方案,只要允许服务器把主体逐块发送,说明每块的大小就可以了。服务器可以用大小为 0 的块作为主体结束的信号,这样可以继续保持连接,为下一个响应做准备。 132 | 133 | 客户端也可以发送分块的数据给服务器。但客户端不知道服务器是否接受分块编码,所以客户端必须做好服务器用 411 Length Required(需要 Content-Length 首部) 响应来拒绝分块请求的准备。 134 | 135 | ![](imgs/h15-11.png) 136 | 137 | #### 分块报文的拖挂 138 | 如果客户端的 TE 首部中说明它是可以接受拖挂的话,就可以在分块的报文最后加上拖挂。拖挂的内容是可选的元数据,客户端不一定需要理解和使用(客户端可以忽略拖挂的内容)。 139 | 140 | ### 内容编码与传输编码的结合 141 | ![](imgs/h15-12.png) 142 | 143 | ### 传输编码的规则 144 | 对报文主体使用传输编码时,必须遵守以下规则: 145 | 1. 传输编码集合中必须包含“分块”,唯一的例外是使用关闭连接来结束报文; 146 | 2. 当使用分块传输编码时,它必须是最后一个作用到报文主体之上的; 147 | 3. 分块传输编码不能多次作用到一个报文主体上。 148 | 149 | 这些规则使得接收方能确定报文的传输长度。 150 | 151 | ## 随时间变化的实例 152 | 网站对象不是静态的,同样的 URL 可能会随着时间的变化指向不同的版本。实例是资源在某个时间的“快照”。 153 | 154 | ![](imgs/h15-13.png) 155 | 156 | ## 范围请求 157 | HTTP 允许客户端只请求文档的一部分或者说某个范围。 158 | 159 | ![](imgs/h15-14.png) 160 | 161 | ![](imgs/h15-15.png) 162 | 163 | Range 首部在点对点(P2P)文件共享客户端软件中得到广泛应用,它们可以从不同的对等实体同时下载多媒体文件的不同部分。 164 | 165 | ## 差异编码 166 | 差异编码是 HTTP 协议的一个扩展,它通过交换对象改变的部分而不是完整的对象来优化传输性能。 167 | 168 | ![](imgs/h15-16.png) 169 | 170 | ![](imgs/h15-17.png) -------------------------------------------------------------------------------- /docs/multi-media.md: -------------------------------------------------------------------------------- 1 | # 多媒体网络 2 | 多媒体最主要的两个特点: 3 | 1. 多媒体信息量往往很大,因此在传输过程中要进行压缩。 4 | 2. 在传输多媒体数据时,对时延和时延抖动均有较高要求。 5 | 6 | ![](../imgs/mm1.png) 7 | 8 | ![](../imgs/mm2.png) 9 | 10 | 由于互联网是非等时的,为了避免失真,可以在应用层设置缓存,等接收的多媒体数据到了一定量再以恒定速率按顺序读取并进行还原播放。 11 | 12 | 在传送时延敏感的实时数据时,不仅传输时延不能太大,而且时延抖动也必须受到限制。 13 | 因此实时数据的传输在传输层采用 UDP 而不是 TCP,丢失容忍也是实时数据的一个重要特点。 14 | 同时发送端还得对多媒体数据的每一个分组增加序号和时间戳,这样接收端就知道在什么时候开始播放缓存中收到的分组。 15 | 16 | 目前互联网提供的音频/视频服务大体可分为三种类型: 17 | 1. 流式存储音频/视频,这种类型是把压缩好的音频/视频文件放在服务器上,用户通过互联网下载文件。这种类型特点是能够边下载边播放。 18 | 2. 流式实况音频/视频,它是一对多的通信,特点是发送方边录制边发送。 19 | 3. 交互式音频/视频,这种类型是用户使用互联网和他人进行实时交互式通信。 20 | 21 | ## 流式存储音频/视频 22 | ![](../imgs/mm3.png) 23 | 24 | ### 具有元文件的万维网服务器 25 | ![](../imgs/mm4.png) 26 | 27 | ### 媒体服务器 28 | ![](../imgs/mm5.png) 29 | 30 | 采用 UDP 的缺点: 31 | 1. 很多单位的防火墙会阻止外部 UDP 分组的进入。 32 | 2. 使用 UDP 传输流式多媒体文件时,如果用户想进行暂停或快进等操作,还需要使用 RTP 和 RTSP 协议,这样就增加了成本和复杂性。 33 | 34 | 所以现在对于流式存储音频/视频很多公司都采用了 TCP 来传送。 35 | 36 | ![](../imgs/mm6.png) 37 | 38 | 图中步骤 4 的读出速率是严格按照源视频文件的规定速率来播放的,另外三个步骤中的数据传送速率则是任意的。 39 | 如果用户暂停播放,那么图中的三个缓存将很快被填满,这时 TCP 发送缓存就暂停读取所存储的视频文件。 40 | 41 | ### 实时流式协议 RTSP 42 | RSTP 协议以客户服务器的方式工作,它是一个应用层的多媒体播放控制协议。RSTP 本身不传送数据,仅是使媒体播放器能够控制多媒体流的传送(有点像 FTP 的控制信道)。 43 | RSTP 是有状态的协议,控制分组可以在 TCP 或 UDP 上传送。 44 | 45 | ![](../imgs/mm7.png) 46 | 47 | ## 交互式音频/视频 48 | 在很长一段时间内,分组话音通信发展并不快,主要是: 49 | 1. 缺少廉价的高质量、低速率的话音信号编解码软件和相应的芯片。 50 | 2. 计算机网络的传输速率和路由器处理速率均不够快,因而导致传输时延大。 51 | 3. 没有保证实时通信服务质量的网络协议。 52 | 4. 计算机网络的规模较小,而通信网只有在具有一定规模后才能产生经济效益。 53 | 54 | ### IP 电话网关 55 | IP 电话网关作用: 56 | 1. 在电话呼叫阶段和呼叫释放阶段进行电话信令的转换。 57 | 2. 在通话期间进行话音编码的转换。 58 | 59 | ![](../imgs/mm8.png) 60 | 61 | ### IP 电话质量 62 | IP 电话通话质量由两个因素决定: 63 | 1. 通话双方端到端的时延和时延抖动。 64 | 2. 话音分组的丢失率。 65 | 66 | 这两个因素都取决于当时网络上的通信量。如果通信量巨大导致发生拥塞,那时延、时延抖动和丢失率都很高,导致通话质量下降。 67 | 因此,一个用户使用 IP 电话的通话质量取决于当时其他许多用户的行为。 68 | 而电路交换电话网则不是,当电话网通信量非常大时,往往使我们无法拨通电话。但只要拨通了电话,那么电信公司就能保证让用户获得满意的通话质量。 69 | 70 | ### IP 电话所需要的几种应用协议 71 | ![](../imgs/mm9.png) 72 | 73 | 1. 信令协议,它使我们能够在互联网上找到被叫用户。 74 | 2. 话音分组的传送协议,它使我们用来进行电话通信的话音数据能够以时延敏感属性在互联网中传送。 75 | 76 | ### 实时运输协议 RTP 77 | RTP 为实时应用提供端到端的运输,但不提供任何服务质量的保证。多媒体数据块在发送端经过压缩编码后,先送给 RTP 封装成 RTP 分组,再依次传递给 UDP、IP。 78 | RTP 不对多媒体数据块做任何处理,只是向应用层提供一些附加的信息,让应用层知道如何处理。 79 | 80 | ![](../imgs/mm10.png) 81 | 82 | RTP 分组只包含 RTP 数组,而控制是由另一个配套使用的 RTCP 协议提供的。RTP 在端口号 1025-65535 之间选择一个偶数 UDP 端口号,而在同一次会话中的 RTCP 则使用下一个奇数 UDP 端口号。 83 | 84 | ### 实时运输控制协议 RTCP 85 | RTCP 协议的主要功能是:服务质量的监视和反馈、媒体间的同步(如 RTP 发送的声音和图像的配合),以及多播组中成员的标志。 86 | RTCP 分组也使用 UDP 来传送,但 RTCP 并不对音频/视频分组进行封装。由于 RTCP 分组很短,因此可以把多个 RTCP 分组封装在一个 UDP 用户数据报中。 87 | 88 | ![](../imgs/mm11.png) 89 | 90 | ### H.323 91 | 现在 IP 电话有两套信令标准: 92 | 1. ITU-T 定义的 H.323 协议。 93 | 2. IETF 提出的会话发起协议 SIP。 94 | 95 | H.323 不是一个单独的协议而是一组协议,它包括系统和构件的描述、呼叫模型的描述、呼叫信令的过程、控制报文、复用、话音编解码器、视像编解码器,以及数据协议等。 96 | 97 | ![](../imgs/mm12.png) 98 | 99 | ![](../imgs/mm13.png) 100 | 101 | ### 会话发起协议 SIP 102 | SIP 使用了 KISS 原则:保持简单、傻瓜(Keep It Simple and Stupid)。 103 | SIP 没有提供像 H.323 那样多的功能。它没有强制使用特定的编解码器,也不强制使用 RIP 协议。 104 | SIP 使用文本方式的客户服务器协议,它有两种构件,即用户代理和网络服务器。 105 | 106 | ## 改进“尽最大努力交付”的服务 107 | 服务质量 QoS 是服务性能的总效果,此效果决定了一个用户对服务的满意程度。 108 | 服务质量可用若干基本的性能指标来描述,包括可用性、差错率、响应时间、吞吐量、分组丢失率、连接建立时间、故障检测和改正时间等。 109 | 110 | ### 调度机制 111 | 这里说的调度是指排队的规则,路由器的默认排队规则是**先进先出**,当队列已满时,后到的分组就得丢弃。先进先出最大的缺点就是**不能区分时间敏感分组和一般数组分组**。 112 | 113 | 在先进先出的基础上增加优先级,就能使优先级高的分组优先得到服务。 114 | 115 | ![](../imgs/mm14.png) 116 | 117 | 只有处理完高优先级的队列,才会去处理低优先级的队列。不过这样也有一个缺点,就是高优先级队列总是有分组时,低优先级队列永远得不到处理。 118 | 119 | **公平排队 FQ** 可解决这一问题。FQ 对每种类别的分组流设置一个队列,然后轮流使每一个队列只能发送一个分组。但公平排队也有不公平的时候,就是长分组得到的服务时间长,短分组比较吃亏,并且公平排队没有区分分组的优先级。 120 | 121 | 为了使高优先级队列中的分组有更多的机会得到服务,可增加队列权重的概念,这就是**加权公平排队 WFQ**。 122 | 123 | ![](../imgs/mm15.png) 124 | 125 | WFQ 给每个分组流分配不同的权重,每个分组流根据不同的权重获得不同的服务时间。下图中分组流 1 的权重为 0.5,剩下的 10 个分组流各为 0.05。在 a 和 b 两种方式中,分组流 1 都能获得更多的服务时间。 126 | 127 | ![](../imgs/mm16.png) 128 | 129 | ### 管制机制 130 | 管制机制可以提供服务质量,对一个数据流,可以在三个方面进行管制:平均速率、峰值速率、突发长度。 131 | 漏桶管制器可以对这三个指标进行管制。 132 | 133 | ![](../imgs/mm17.png) 134 | 135 | 漏桶机制与加权公平排队相结合 136 | 137 | ![](../imgs/mm18.png) 138 | 139 | ### 综合服务 IntServ 和资源预留协议 RSVP 140 | IntServ 可对单个应用会话提供服务质量的保证,其特点有二:资源预留和呼叫建立。 141 | 142 | IntServ 定义了两类服务: 143 | 1. 有保证的服务,可保证一个分组在通过路由器时的排队时延有一个严格的上限。 144 | 2. 受控负载的服务,可以使应用程序得到比通常的“尽最大努力”更加可靠的服务。 145 | 146 | IntServ 由四个部分组成: 147 | 1. 资源预留协议 RSVP,它是 IntServ 的信令协议。 148 | 2. 接纳控制,用来决定是否同意对某一资源的请求。 149 | 3. 分类器,用来把进入路由器的分组进行分类,并根据分类的结果把不同类别的分组放入特定的队列。 150 | 4. 调度器,根据服务质量要求决定分组发送的前后顺序。 151 | 152 | ![](../imgs/mm19.png) 153 | 154 | ![](../imgs/mm20.png) 155 | 156 | IntServ/RSVP 使得互联网的体系结构发生了根本的变化,因为 IntServ/RSVP 使得互联网不再是提供“尽最大努力交付”的服务。 157 | 158 | ![](../imgs/mm21.png) 159 | 160 | ### 区分服务 DiffServ 161 | 由于 IntServ/RSVP 较复杂,很难在大规模的网络中实现,因此 IETF 提出了一种新策略,即区分服务 DiffServ。 162 | 163 | 要点如下: 164 | 1. 力图不改变网络的基础结构,但在路由器中增加区分服务的功能。 165 | 2. 网络被划分为许多个 DS 域,一个 DS 域在一个管理实体的控制下实现同样的区分服务策略。 166 | 3. 边界路由器可分为分类器和通信量调节器两大部分。调节器又由标记器、整形器、测定器组成。 167 | 4. DiffServ 提供了一种聚合功能,它不是为网络中的每一个流维持供转发时使用的状态信息,而是把若干个流根据其 DS 值聚合成少量的流。路由器对相同 DS 值的流都按相同的优先级进行转发。 168 | 169 | ![](../imgs/mm22.png) 170 | 171 | ![](../imgs/mm23.png) 172 | 173 | #### 每跳行为 PHB 174 | “行为”就是指在转发分组时路由器对分组是怎样处理的。“行为”例子可以是:首先转发这个分组或最后丢弃这个分组。 175 | “每跳”是强调这里所说的行为只涉及到本路由器转发的这一跳的行为,而下一个路由器怎样处理和本路由器的处理无关。 176 | 177 | PHB 可分为迅速转发 PHB 和确保转发 PHB。 -------------------------------------------------------------------------------- /docs/wireless-network.md: -------------------------------------------------------------------------------- 1 | # 无线网络和移动网络 2 | ## 无线局域网 WLAN 3 | 无线局域网可分为两大类,第一类是有固定基础设施的,第二类是无固定基础设施的。 4 | ### IEEE802.11 5 | 802.11 是无线以太网的标准,它使用星形拓扑,其中心叫做接入点 AP(access point),在 MAC 层使用 CSMA/CA 协议。 6 | 使用 802.11 系列协议的局域网又叫 Wi-Fi。 7 | 8 | 802.11 标准规定无线局域网的最小构件是基本服务集 BSS。一个 BSS 包括一个基站和若干个移动站,所有的站在本 BSS 内都可直接通信,但和本 BSS 以外的站点通信就得通过本 BSS 的基站。在 802.11 的术语中,上面提到的 AP 就属于 BSS 的基站。基本服务集的服务范围是由基站所发射的电磁波的辐射范围确定的。 9 | 10 | AP 有一个不超过 32 字节的服务集标识符 SSID 和一个通信信道,SSID 其实就是指使用该 AP 的无线局域网的名称。 11 | 一个 BSS 所覆盖的地理范围叫做基本服务区,一般直径不超过 100 米。 12 | 13 | BSS 可以通过 AP 连接到一个分配系统 DS,然后再连接到另一个 BSS,这样就构成了一个扩展的服务集 ESS。 14 | 15 | ![](../imgs/wn1.png) 16 | 17 | ESS 还可为无线用户提供到 802.x 局域网(非 802.11 无线局域网)的接入。这种接入是通过叫做门户的设备来实现的,作用相当于网桥。 18 | 19 | 移动站要和 AP 建立关联的方式有两种: 20 | 1. 被动扫描,即移动站等待接收 AP 周期性发出的信标帧,信标帧中包含有若干系统参数。 21 | 2. 主动扫描,即移动站主动发出探测请求帧,然后等待从 AP 发回的探测响应帧。 22 | 23 | ### 移动自组网络 24 | 无固定基础设施的无线局域网,又叫自组网络。 25 | 26 | ![](../imgs/wn2.png) 27 | 28 | ### 802.11 局域网的物理层 29 | ![](../imgs/wn3.png) 30 | 31 | 以上几种标准都使用共同的媒体接入控制协议,都可以用于有固定基础设施或无固定基础设施的无线局域网。 32 | 33 | ### CSMA/CA 协议 34 | CSMA/CD 协议的前一部分 CSMA 能够在无线局域网中使用,在发送数据之前先对媒体进行载波监听。但碰撞检测(CD)在无线环境下却不能使用,理由如下: 35 | 1. 碰撞检测要求在发送数据的同时,还要不间断地检测信道。在无线局域网的适配器上实现碰撞检测,硬件花费会很大。 36 | 2. 即使在硬件上实现无线局域网的碰撞检测,也仍然无法避免碰撞的发生。 37 | 38 | 无线局域网不需要进行碰撞检测是由无线信道本身的特点决定的。 39 | 40 | ![](../imgs/wn4.png) 41 | 42 | 图 9-4a,A 和 C 都想和 B 通信,由于 A 和 C 相距较远,彼此听不到对方。所以都以为信道空闲,而同时向 B 发送数据,这种未能检测出信道上其他站点信号的问题叫做隐蔽站问题。 43 | 44 | 图 9-4b,B 向 A 发送数据,C 检测到 B 的信号,导致其不敢向 D 发送数据,这就是暴露站问题。 45 | 46 | 由此可见,无线局域网可能出现检测错误的情况:检测到信道空闲,其实并不空闲;检测到信道忙,其实并不忙。 47 | 48 | 无线局域网使用的是 CSMA/CA 协议,CA 的意思是碰撞避免,即要尽量减少碰撞发生的概率。同时 802.11 局域网还使用了停止等待协议(可靠传输协议),每发完一帧后,都要等到收到对方的确认帧后才会发送下一帧,这叫链路层确认。 49 | 50 | 802.11 的 MAC 层包括两个子层: 51 | 1. 分布协调功能 DCF。DCF 不采用中心控制,而是每一个结点使用 CSMA 机制的分布式接入算法,让各站通过争用信道来获取发送权。 52 | 2. 点协调功能 PCF。PCF 是选项,是用 AP 集中控制整个 BSS 内的活动。PCF 用类似于探询的方法把发送数据权轮流交给各站,从而避免了碰撞的发生。 53 | 54 | ![](../imgs/wn5.png) 55 | 56 | 为了尽量避免碰撞,802.11 规定,所有的站在完成发送后,必须等待一段很短的时间(继续监听)才能发送下一帧,这称为帧间间隔 IFS。 57 | 帧间间隔的长短取决于该站要发送的帧的类型,高优先级的帧等待时间短,低优先级的帧等待时间长。 58 | 1. SIFS,短时间间隔,长度为 28 微秒,它是最短的帧间间隔,用来分隔开属于一次对话的各帧。在这段时间内,一个站应当能从发送方式切换为接收方式。使用 SIFS 的帧类型有:ACK 帧、CTS 帧、由过长的 MAC 帧分片后的数据帧,以及所有回答 AP 探询的帧和在 PCF 方式中 AP 发出的任何帧。 59 | 2. DIFS,分布协调功能帧间间隔,它比 SIFS 的帧间间隔要长得多,长度为 128 微秒。在 DCF 方式中,DIFS 用于发送数据帧和管理帧。 60 | 61 | ![](../imgs/wn6.png) 62 | 63 | 为什么信道空闲还要再等待一段时间 DIFS 呢?要考虑到有其他高优先级的帧要发送。 64 | 65 | 目的站收到帧后,经过时间间隔 SIFS 后,向源站发送 ACK 帧。若源站没有收到 ACK 帧,则重传数据帧,或者经过若干次重传失败后放弃发送。 66 | 67 | 68 | 802.11 标准还采用了一种叫做**虚拟载波监听的机制**,就是让源站把它要占用信道的时间通知给其他站,以便让其他站在这一段时间都停止发送数据,这样就大大减少碰撞的机会。“源站的通知”就是源站在其 MAC 帧首部中的第二个字段“持续时间”中,填入在本帧结束后还要占用信道的时间。当一个站检测到正在信道中传送的 MAC 帧首部的“持续时间”字段时,就调整自己的**网络分配向量 NAV**。NAV 指出必须经过多少时间才能完成数据帧的这次传输,从而使信道转入空闲的状态。 69 | 70 | 当信道从忙态转为空闲时,任何一个站要发送数据,必须等待一个 DIFS 的间隔(如果要发送的不是第一个帧,还得进入争用窗口),并计算随机退避时间,以便再次试图接入到信道。 71 | 72 | ![](../imgs/wn7.png) 73 | 74 | 若检测到信道忙,就冻结退避计时器的剩余时间,等待信道重新变成空闲并再经过时间间隔 DIFS 后,从剩余时间开始继续倒计时。如果倒计时减少到 0,就开始发送整个数据帧。 75 | 冻结退避计时器剩余时间的做法是为了使协议对所有站点更加公平。 76 | 77 | **CSMA/CA 算法归纳如下** 78 | 79 | ![](../imgs/wn8.png) 80 | 81 | #### 对信道进行预约 82 | 802.11 允许源站对信道进行预约。 83 | 84 | ![](../imgs/wn9.png) 85 | 86 | 1. 请求发送 RTS 控制帧,它包括源地址、目的地址和这次通信所需的时间。 87 | 2. 允许发送 CTS 控制帧,它也包括这次通信所需的时间。 88 | 89 | ![](../imgs/wn10.png) 90 | 91 | ### 802.11 局域网的 MAC 帧 92 | 802.11 帧有三种类型:控制帧、数据帧、管理帧。 93 | 94 | ![](../imgs/wn11.png) 95 | 96 | 1. MAC 首部,共 30 字节,帧的复杂性都在帧的首部。 97 | 2. 帧主体,即数据部分,不超过 2312 字节。 98 | 3. 帧检验序列 FCS 是 MAC 尾部,共 4 字节。 99 | 100 | #### 数据帧的地址 101 | 帧有 4 个地址字段,地址 4 用于自组网络。 102 | 103 | ![](../imgs/wn12.png) 104 | 105 | ![](../imgs/wn13.png) 106 | 107 | ## 无线个人区域网 WPAN 108 | 无线个人区域网就是个人把电子设备用无线技术连接起来的自组网络,不需要接入 AP,整个网络的范围约为 10 米。 109 | 110 | 1. 蓝牙系统 111 | 2. 低速 WPAN 112 | 3. 调整 WPAN 113 | 114 | ## 无线城域网 WMAN 115 | WMAN 可提供“最后一英里”的宽带无线接入。在许多情况下,无线城域网可用来代替现有的有线宽带接入。 116 | 117 | ![](../imgs/wn14.png) 118 | 119 | ## 蜂窝移动通信 120 | Wi-Fi 无线局域网可以接入到互联网,但必须是当计算机处在某个 Wi-Fi 的热点之中,并且一个热点的覆盖范围只有 10-100 米。 121 | 122 | 蜂窝移动通信又称为小区制移动通信,它的特点是把整个网络服务区划分成许多小区(cell,也就是蜂窝),每个小区设置一个基站,负责本小区各个移动站的联络与控制。移动站的发送与接收都得经过基站完成。 123 | 124 | 蜂窝移动网络的发展非常迅速,到现在已经有很多标准: 125 | 1. 第一代蜂窝移动通信是为话音通信设计的模拟 FDM 系统。1G 的蜂窝无线网络早已淘汰。 126 | 2. 第二代蜂窝移动通信的代表性体制就是最流行的 GSM 系统。这个系统带宽只有 200 KHz,除了基本的话音通信,它只能提供低速数字通信(短信服务)。 127 | 3. 第三代蜂窝移动通信使用的带宽增大到 5 MHz,从 3G 开始以后的各代蜂窝移动通信都是以传输数据业务为主的通信系统。 128 | 4. 第四代蜂窝移动通信的目标峰值数据率是:固定的和低速移动通信时应达到 1G/s,在高速移动通信时(如火车)应达到 100M/s。由此可见,目前全世界所声称的 4G 蜂窝无线网络,其实都远未达到真正的 4G 标准。 129 | 130 | ![](../imgs/wn15.png) 131 | 132 | ![](../imgs/wn16.png) 133 | 134 | ### 移动 IP 135 | 移动 IP 协议是由 IETF 开发的一种技术,这种技术允许计算机移动到外地时,仍然保留其原来的 IP 地址。 136 | 详情请看 414 页。 137 | 138 | ### 蜂窝移动通信网中对移动用户的路由选择 139 | 详情请看 418 页。 140 | 141 | ### GSM 中的切换 142 | 切换就是移动用户与相关联的基站发生了改变,并会使得呼叫的传输路由发生变化。切换发生的原因是: 143 | 1. 当前基站和移动用户之间的信号减弱,有使呼叫中断的可能。 144 | 2. 蜂窝小区的用户太多,基站不堪重负。这时会把移动用户切换到相邻的不太拥塞的蜂窝小区的基站相关联, 以减轻原来基站的负荷。 145 | 146 | ![](../imgs/wn17.png) 147 | 148 | ### 无线网络对高层协议的影响 149 | 移动用户由于移动到不同地方导致切换相关联的基站时,网络连接会发生短时间的中断。假如使用 TCP,这会造成 TCP 报文段的丢失,这时 TCP 的拥塞机制就会减少其拥塞窗口, 150 | 从而减少 TCP 发送报文段的速率。 151 | 152 | 可以使用三种方法来处理这个问题: 153 | 1. 本地恢复,指差错发生在什么地方,就在什么地方改正。例如无线局域网的自动请求重传 ARQ 协议就属于本地恢复措施。 154 | 2. 让 TCP 发送方知道什么地方使用了无线链路。只有 TCP 确认是有线网络部分发生了拥塞,才采用拥塞控制的策略,这需要一些特殊的技术。 155 | 3. 把含有移动用户的端到端 TCP 连接拆分成两个互相串接的 TCP 连接。 156 | 157 | ## 两种不同的无线上网 158 | ![](../imgs/wn18.png) -------------------------------------------------------------------------------- /docs/internet-security.md: -------------------------------------------------------------------------------- 1 | # 网络安全 2 | ## 网络安全问题概述 3 | 计算机网络通信面临两大类威胁,即被动攻击和主动攻击。 4 | 5 | ![](../imgs/is1.png) 6 | 7 | ### 被动攻击 8 | 被动攻击是指攻击者从网络上窃听他人的的通信内容,通常把这类攻击称为截获。在被动攻击中,攻击者只是观察和分析某一个协议数据单元 PDU 而不干扰信息流。 9 | 通过研究 PDU 的协议控制信息部分、长度和传输的频度,从而了解所交换数据的某种性质,这又称为流量分析。 10 | 11 | ### 主动攻击 12 | #### 篡改 13 | 攻击者篡改网络传送的报文,包括中断传送的报文或传送伪造的报文,这种攻击又称为更改报文流。 14 | #### 恶意程序 15 | 恶意程序包括以下几种: 16 | 1. 计算机病毒,一种会传染其他程序的程序,传染是通过修改其他程序来把自身或变种复制进去而完成的。 17 | 2. 计算机蠕虫,一种通过网络的通信功能将自身从一个结点发送到另一个结点并自动启动运行的程序。 18 | 3. 特洛伊木马,它执行的功能并非所声称的功能而是某种恶意的功能。 19 | 4. 逻辑炸弹,一种当运行环境满足某种特定条件时执行其他特殊功能的程序。 20 | 5. 后门入侵,是指利用系统中的漏洞通过网络入侵系统。 21 | 6. 流氓软件,一种未经用户允许就在用户计算机上安装运行并损害用户利益的软件,其典型特征是:强制安装、难以卸载、浏览器劫持、广告弹出... 22 | 23 | #### 拒绝服务 DoS 24 | 指攻击者向互联网上的某个服务器不停地发送大量分组,导致服务器无法提供正常服务,甚至瘫痪。 25 | 若从成百上千个地方(网络地址)集中攻击一个网站,称为分布式拒绝服务。 26 | 27 | 对于主动攻击,可以采取适当的措施加以检测。但对于被动攻击,通常是检测不出来。根据这些特点,计算机网络通信安全的的目标如下: 28 | 1. 防止析出报文内容和流量分析。 29 | 2. 防止恶意程序。 30 | 3. 检测更改报文流和拒绝服务。 31 | 32 | ### 安全的计算机网络 33 | 一个安全的计算机网络应该达到以下四个目标: 34 | 1. 保密性,即信息只有接收方和发送方才能识别,截获者无法看懂。 35 | 2. 端点鉴别,需要鉴别对方的真实身份。 36 | 3. 信息的完整性,必须确认收到的信息是完整的,没有被篡改。 37 | 4. 运行的安全性。 38 | 39 | ### 数据加密模型 40 | ![](../imgs/is2.png) 41 | 42 | ## 两类密码体制 43 | ### 对称密钥密码体制 44 | 对称密钥密码体制,即加密密钥和解密密钥是使用相同的密码体制。 45 | 46 | 数据加密标准 DES 属于对称密钥密码体制,它的加强版是三重 DES。 47 | ### 公钥密码体制 48 | 公钥密码体制使用不同的加密密钥与解密密钥。公钥密码体制产生的主要原因有两个:一是对称密钥密码体制的密钥分配问题,二是对数字签名的需求。 49 | 在公钥密码体制中,加密密钥是公开的,解密密钥是需要保密的,加密算法和解密算法也是公开的。 50 | 51 | 公钥密码体制的加密和解密有如下特点: 52 | 1. **密钥对产生器**产生出接收者 B 的一对密钥,即加密密钥 PK 和解密密钥 SK。 53 | 2. 发送者 A 用 B 的公钥 PK 作为加密密钥来加密信息,B 接收后用解密密钥 SK 解密。 54 | 55 | ![](../imgs/is3.png) 56 | 57 | 使用对称密钥时,由于双方使用同样的密钥,因此在通信信道上可以进行一对一的双向保密通信,双方都可以用同一个密钥加密解密。 58 | 59 | 使用公开密钥时,在通信信道上可以是多对一的单向保密信道。即可以有多人持有 B 的公钥,但只有 B 才能解密。 60 | 61 | **任何加密方法的安全性取决于密钥的长度,以及攻击密文所需的计算量**。 62 | 63 | ## 数字签名 64 | 数字签名必须能保证以下三个功能: 65 | 1. 接收者能够核实发送者对报文的签名,即接收者能确信该报文是发送者发送的。这叫**报文鉴别**。 66 | 2. 接收者确信所收到的数据和发送者发送的完全一样而没有被篡改过,这叫**报文的完整性**。 67 | 3. 发送者事后不能抵赖对报文的签名,这叫**不可否认**。 68 | 69 | ![](../imgs/is4.png) 70 | 71 | 看上图,任何人都能用 A 的公钥 PK 对密文进行 E 运算后得到 A 发送的明文。可见这种通信并非为了保密,而是为了进行签名和核实签名,即确认此信息是 A 发送的。 72 | 但上述过程仅对报文进行了签名,对报文 X 本身却未保密,所以要采用下图的方法,同时实现秘密通信和数字签名。 73 | 74 | ![](../imgs/is5.png) 75 | 76 | ## 鉴别 77 | 鉴别是要验证通信的对方的确是自己所要通信的对象,而不是其他冒充者,并且所传送的报文是完整的,没有被篡改过。 78 | 鉴别包含了报文鉴别和实体鉴别。 79 | 80 | ### 报文鉴别 81 | #### 密码散列函数 82 | 使用数字签名就可以实现对报文的鉴别,但这个方法有个缺点,就是对较长的报文进行数字签名会使计算机增加很大的负担。 83 | 因此,我们需要一种相对简单的方法来对报文进行鉴别,那就是使用密码散列函数。 84 | 85 | 散列函数特点: 86 | 1. 输入长度可以很长,但输出长度固定且较短,散列函数的输出称为散列值。 87 | 2. 不同的输入有可能得到相同的散列值,输入和输出是多对一的关系。 88 | 3. 单向函数,不能通过输出得到输入。 89 | 90 | ![](../imgs/is6.png) 91 | 92 | #### MD5 和 SHA-1 93 | MD 是 Message Digest 的缩写,意思是报文摘要,MD5 是报文摘要的第 5 个版本。 94 | 由于 MD5 现在可以用系统的方法找出一对与原来报文摘要相同的报文摘要,所以 MD5 被一个叫做安全散列算法 SHA 的标准所取代。 95 | 96 | MD5 算法过程: 97 | 1. 先把报文按模 2**64 计算余数(64 位),追加在报文后面。 98 | 2. 在报文和余数之间填充 1-512 位,使得填充后的总长度是 512 的整数倍。填充的首位是 1,后面都是 0。 99 | 3. 把追加和填充后的报文分割为一个个 512 位的数据块,每个 512 位的报文数据再分成 4 个 128 位的数据块依次送到不同的散列函数进行 4 轮计算。每一轮又都按 32 位的小数据块进行复杂的运算,一直到最后计算出 MD5 报文摘要代码(128 位)。 100 | 101 | SHA 和 MD5 相似,但码长为 160 位。 102 | 103 | #### 报文鉴别码 104 | ![](../imgs/is7.png) 105 | 106 | ### 实体鉴别 107 | 报文鉴别是鉴别报文的发送者,实体鉴别是在系统接入的全部持续时间内对通信的对方实体只验证一次。 108 | 109 | ## 密钥分配 110 | 由于密码算法是公开的,网络的安全性就完全基于密钥的安全保护上。密码学有一个重要的分支——密钥管理。密钥管理包括:密钥的产生、分配、注入、验证和使用。 111 | 112 | 密钥分配是密钥管理中最大的问题,密钥必须通过最安全的通路进行分配。 113 | 114 | ### 对称密钥的分配 115 | 目前常用的密钥分配方式是设立密钥分配中心 KDC。KDC 是大家都信任的机构,其任务是给需要进行秘密通信的用户一个临时的会话密钥(仅使用一次)。 116 | 117 | ![](../imgs/is8.png) 118 | 119 | ### 公钥的分配 120 | 认证中心 CA 将公钥和其对应的实体进行绑定。 121 | 122 | ## 互联网使用的安全协议 123 | ### 网络层安全协议 124 | IPsec 是 IP Security 的缩写,IPsec 不是单一的协议,而是能够在 IP 层提供互联网通信安全的协议族。实际上 IPsec 是个框架,它允许双方选择合适的算法和参数。 125 | 为保证互操作性,IPsec 还包含了一套加密算法。 126 | 127 | IPsec 协议族可划分为三个部分: 128 | 1. IP 安全数据报格式的两个协议:鉴别首部 AH 协议和封装安全有效载荷 ESP 协议。 129 | 2. 有关加密算法的三个协议。 130 | 3. 互联网密钥交换 IKE 协议。 131 | 132 | AH 协议提供源点鉴别和数据完全性,但不能保密。ESP 提供源点鉴别、数据完整性和保密。AH 协议的功能都已包含在 ESP 协议中,使用 ESP 协议就可以不用 AH 协议。 133 | 134 | 使用 AH 或 ESP 协议的 IP 数据报称为 IP 安全数据报,它有两种工作方式: 135 | 1. 运输方式,在整个运输层报文段前后分别添加若干控制信息,再加上 IP 首部,构成 IP 安全数据报。 136 | 2. 隧道方式,在原始的 IP 数据报前后分别添加若干控制信息,再加上新的 IP 首部,构成 IP 安全数据报。 137 | 138 | #### 安全关联 139 | 在发送安全 IP 数据报之前,必须创建一条网络层的逻辑链接,即安全关联 SA。安全关联是从源点到终点的单向连接,它能提供安全服务。如要进行双向安全通信,则两个方向都要建立安全关联。 140 | 141 | ![](../imgs/is9.png) 142 | 143 | #### IP 安全数据报格式 144 | ![](../imgs/is10.png) 145 | 146 | #### IPsec 的其他构件 147 | **安全关联数据库 SAD** 存放了很多条安全关联 SA。当主机要发送 IP 安全数据报时,要在 SAD 中查找对应的 SA,以获得必要的信息,来对该 IP 安全数据报提供保护;当主机要接收 IP 安全数据报时,也要在 SAD 中查找相应的 SA,以获得信息来检查该分组的安全性。 148 | 149 | **安全策略数据库 SPD**,SPD 指明什么样的数据需要进行 IPsec 处理。 150 | 151 | **互联网密钥交换 IKE** 协议,用于为 IP 安全数据报创建安全关联 SA。 152 | 153 | ### 运输层安全协议 154 | #### 安全套接字层 SSL 和运输层安全 TLS 155 | SSL 作用在端系统应用层的 HTTP 和运输层之间,在 TCP 之上建立一个安全通道。 156 | IETF 在 SSL3.0 的基础上开发了 TLS 协议,为基于 TCP 的网络应用提供安全数据传输服务。 157 | 158 | ![](../imgs/is11.png) 159 | 160 | 应用层使用 SSL 最多的是 HTTP,但 SSL 并非仅用于 HTTP,而是可用于任何应用层协议。 161 | 162 | SSL 提供的安全服务分为三种: 163 | 1. SSL 服务器鉴别,允许用户证实服务器的身份。支持 SSL 的客户端通过验证来自服务器的证书,来鉴别服务器的真实身份并获得服务器公钥。 164 | 2. SSL 客户鉴别,SSL 的可选服务,允许服务器证实客户的身份。 165 | 3. 加密的 SSL 会话,对报文进行加密,并检测报文是否被篡改。 166 | 167 | ![](../imgs/is12.png) 168 | 169 | SSL 还缺少一些措施来防止在互联网商务中出现各种可能的欺骗行为。 170 | 171 | #### SSL 建立连接与关闭 172 | 173 | ![](../imgs/is14.png) 174 | 175 | ![](../imgs/is15.png) 176 | 177 | 更具体的过程请看参考资料[SSL/TLS 握手过程详解](https://www.jianshu.com/p/7158568e4867) 178 | 179 | ## 系统安全:防火墙与入侵检测 180 | ### 防火墙 181 | 防火墙作为一种访问控制技术,通过严格控制进出网络边界的分组,禁止不必要的通信,从而减少潜在入侵的发生。 182 | 防火墙是一种特殊编程的路由器,安装在一个网点和网络的其余部分之间,目的是实施访问控制策略。 183 | 184 | ![](../imgs/is13.png) 185 | 186 | 防火墙技术一般分为两类: 187 | 1. 分组过滤路由器是一种具有分组过滤功能的路由器,它根据过滤规则对进出内部网络的分组执行转发或丢弃。过滤规则是基于分组的网络层或运输层首部的信息。例如源/目的 IP 地址、端口号、协议类型等等。 188 | 2. 应用网关也称为代理服务器,它在应用层通信中扮演报文中继的角色。在应用网关中,可以实现基于应用层数据的过滤和高层用户鉴别。 189 | 190 | 防火墙就同时具有以上两种技术。 191 | 192 | ### 入侵检测系统 193 | 入侵检测系统 IDS 对进入网络的分组执行深度分组检查,当观察到可疑分组时,向网络管理员发出告警或执行阻断操作(由于 IDS 误报率高,一般不执行自动阻断)。IDS 能用于检测多种网络攻击,如网络映射、端口扫描、DoS 攻击、蠕虫和病毒、系统漏洞攻击等。 194 | 195 | 入侵检测系统一般分为基于特征的入侵检测和基于异常的入侵检测两种。 196 | -------------------------------------------------------------------------------- /docs/ethernet.md: -------------------------------------------------------------------------------- 1 | # 数据链路层 2 | 一般的网络适配器都包括了数据链路层和物理层功能。 3 | 4 | 数据链路层使用的信道主要有两种类型: 5 | 1. 点对点信道。 6 | 2. 广播信道。 7 | 8 | 数据链路层协议的数据单元称为帧。 9 | 10 | 数据链路层协议有许多种,但有三个基本问题是共同的:**封装成帧**、**透明传输**、**差错检测**。 11 | ### 封装成帧 12 | 封装成帧就是在 IP 数据报前后加上首部和尾部,构成帧。帧首部和尾部的作用是进行帧定界(确定帧的界限)。 13 | 14 | ![](../imgs/ppp2.png) 15 | 16 | 帧头部开始的控制字符是 SOH(0x01),帧结束的控制字符是 EOT(0x04),如果接收到的帧两个控制字符中有一个不对或没有,就代表帧接收不完整或出错,必须丢弃。 17 | 18 | ### 透明传输 19 | 透明传输就是让帧中数据部分的数据不会被解释成 SOH 或 EOT,就像数据是透明一样。 20 | 21 | 具体做法:发送端的数据链路层在数据中出现的控制字符 SOH 或 EOT 的前面插入一个转义字符 ESC(0x1b);而接收端的数据链路层在把数据送往网络层前先把转义字符删除; 22 | 这个方法称为字节填充。如果转义字符也出现在数据中,那就在转义字符前插入一个转义字符。 23 | 24 | ![](../imgs/ppp3.png) 25 | 26 | ### 差错检测 27 | 数据在传输中有可能会出错,0 变成 1,或 1 变成 0,这称为**比特差错**。 28 | 29 | 传输比特的错误数占比特总数的比率称为误码率 BER。为了解决比特差错问题,使用了称为**循环冗余检验 CRC** 的检错技术。 30 | 31 | CRC 在数据后面添加供差错检测用的 n 位冗余码,然后构成一个帧发送出去,这种为了检测差错而添加的冗余码被称为**帧检验序列 FCS**。 32 | 一种较方便的方法是用多项式来表示循环冗余检验过程。 33 | 34 | 在数据链路层,发送端 FCS 的生成和接收端的 CRC 检验都是用硬件完成的,处理迅速,不会延误数据的传输。 35 | 36 | ### 传输差错类型 37 | 1. 比特差错 38 | 2. 帧丢失、帧重复、帧失序 39 | 40 | 为了应对第 2 个问题,在 CRC 检错的基础上,增加了帧编号、确认、重传机制,这种方法在历史上曾经起到很好作用。 41 | 但现在通信链路的质量比起以前有了很大的提高,由于通信质量问题而引起的差错概率已经大大降低了,因此现在采用了区别对待的方法。 42 | 43 | 1. 对于通信质量良好的有线传输链路,数据链路层不使用确认和重传机制,将改正差错的任务交由上层协议(例如运输层的 TCP)来完成。 44 | 2. 对于通信质量较差的无线传输链路,使用确认和重传机制,即向上提供可靠的传输服务。 45 | 46 | ## 使用广播信道的数据链路层 47 | 局域网最主要的特点:网络为一个单位所拥有,且地理范围和站点数目有限。 48 | 49 | 局域网按拓扑分类: 50 | 1. 星形网 51 | 2. 环形网 52 | 3. 总线网 53 | 54 | ![](../imgs/ll1.png) 55 | 56 | ### 共享信道的两种方法 57 | #### 静态划分信道 58 | 用户只要分配到了信道,就不会和其他用户发生冲突。但是代价较高,不适合局域网使用。 59 | 60 | #### 动态媒体接入控制 61 | 又称为多点接入,其特点是信道不是固定分配给用户的。这里又分为两类: 62 | 1. 随机接入,所有用户可随机地发送信息,但用户在同一时刻发送信息会发生碰撞导致发送失败。因此必须要有解决碰撞的网络协议。 63 | 2. 受控接入,用户不能随机地发送信息,必须服从一定的控制。这类典型的代表有分散控制的**令牌环局域网**和集中控制的**多点线路探询**,又称为轮询。 64 | 65 | 以太网属于随机接入,受控接入在局域网中用得比较少。 66 | 67 | ### 适配器的作用 68 | 适配器实现的功能包含了数据链路层和物理层的功能。 69 | 70 | 计算机的 MAC 地址就在适配器的 ROM 中,而 IP 地址则在计算机的存储器中。 71 | 72 | 适配器对于目的地址不是自己的帧采取丢弃行为。 73 | 74 | 适配器装有处理器和存储器(包括 RAM 和 ROM),适配器和局域网之间的通信通过电缆或双绞线以串行传输的方式进行,适配器和计算机之间通过主板上的 I/O 总线以并行的传输方式进行。因此,适配器的一个重要功能就是对数据的串行传输和并行传输进行转换。同时,适配器还要实现以太网协议。 75 | 76 | ![](../imgs/ll2.png) 77 | 78 | ### CSMA/CD 协议 79 | 总线的特点,当一台计算机发送数据时,总线上的所有计算机都能检测到这个数据,这就是广播通信方式(一对多)。 80 | 81 | 以太网为了通信的简便,采取了两种措施: 82 | 1. 采用无连接的工作方式,不必建立连接就能发送数据,适配器对发送的帧不进行编号,不要求对方发回确认。对于是否需要重传则由高层协议决定(例如 TCP)。在总线上同时只允许一台计算机发送数据,为此使用了 CSMA/CD 协议,即载波监听多点接收/碰撞检测。 83 | 84 | 2. 以太网发送的数据使用曼彻斯特编码的信号。 85 | 86 | #### CSMA/CD 协议的要点 87 | 1. 多点接入,说明这是总线型的网络,许多计算机以多点接入的方式连接在一根总线上。协议的实质就是载波监听和碰撞检测。 88 | 2. 载波监听就是用电子技术检测总线上有没有其他计算机在发送消息(检测信道)。 89 | 3. 碰撞检测也就是边发送边监听,即适配器边发送数据边检测信道上的信号电压的变化情况,以便判断是否其他计算机也在发送数据。当几个计算机同时发送信息时,总线上的信号电压会增大。当适配器检测到信号电压变化幅度超过一定的门限值时,就认为有多个计算机在发送数据,表明产生了碰撞。 90 | 91 | ![](../imgs/ll3.png) 92 | 93 | 显然,使用 CSMA/CD 协议时一台计算机不可能同时进行接收和发送(但必须边发送边监听)。因此使用 CSMA/CD 协议的以太网只能进行双向交替通信(半双工通信)。 94 | 95 | 以太网的端到端往返时间称为**争用期**,又称为**碰撞窗口**。即经过争用期这段时间还没有检测到碰撞(在这段时间内收到信息就是发生了碰撞),才能肯定这次发送不会碰撞。 96 | 97 | 以太网使用**截断二进制指数退避算法**来确定碰撞后重传的时机。如果重传达 16 次后仍不能成功,则丢弃帧,并报告高层。 98 | 99 | 为了避免发送的帧太短,以太网规定了最短的帧长必须为 64 字节,即 512 比特。如果要发送的数据太少,则加入一些填充字节。 100 | 101 | 由于争用期的时间不能太长,所以以太网的最大端到端长度约为 5 KM,但实际上远远没有这么大。 102 | 103 | 当发送数据的计算机检测到碰撞时,除了立即停止发送数据外,还要继续发送 32 比特或 48 比特的人为干扰信号,这称为**强化碰撞**。 104 | 105 | ![](../imgs/ll4.png) 106 | 107 | 以太网还规定了帧间最小间隔为 9.6 微秒,相当于 96 比特的时间。这样做是为了使刚接收到数据帧的计算机的接收缓存来得及清理,做好接收下一帧的准备。 108 | 109 | ### 星形拓扑 110 | 采用星形拓扑的以太网在星形的中心增加了一种可靠性非常高的设备,叫做集线器。双绞线以太网总是和集线器配合使用。 111 | 由于性价比很高的 10BASE-T 双绞线以太网的出现,从此以太网的拓扑就从总线型变成了星形网络。 112 | 113 | ![](../imgs/ll5.png) 114 | 115 | #### 集线器特点 116 | 1. 集线器使用电子器件来模拟实际电缆线的工作,使用集线器的以太网逻辑上仍是一个总线网,各计算机共享逻辑上的总线,使用的还是 CSMA/CD 协议(各计算机中的适配器执行 CSMA/CD 协议)。并且同一时刻只允许一个计算机发送数据。 117 | 2. 一个集线器有许多个接口,例如 8 - 16 个。 118 | 3. 集线器工作在物理层,它的每个接口仅是简单地转发比特,不进行碰撞检测。若两个接口同时有信号输入(即发生碰撞),那么所有的接口都接收不到正确的帧。 119 | 120 | ![](../imgs/ll6.png) 121 | 122 | 4. 集线器采用了专门的芯片,进行自适应串音回波抵消。 123 | 124 | ### 以太网的 MAC 层 125 | IEEE802 标准为局域网规定了一种 48 位的全球地址,指局域网上每一台计算机中固化在适配器 ROM 中的地址。IEEE 的注册管理机构 RA 负责分配地址字段 6 个字节中的前 3 个字节,购买地址的厂家自行分配剩余的 3 个字节,只要不重复即可。MAC 地址也叫物理地址或硬件地址,实际上就是适配器地址。 126 | 127 | MAC 地址第一字节的最低位为 I/G(Individual/Group) 位。I/G 位为 0 时,表示是一个单播地址;I/G 位为 1 时表示组地址,用来进行多播。 128 | IEEE 还规定地址字段第 1 字节的最低第二位规定为 G/L(Global/Local) 位。G/L 为 0 时代表是全球管理(全球没有相同的地址),为 1 时是本地管理。 129 | 130 | 适配器有过滤功能,对收到的每一个帧都要检查其目的地址,如果其地址不是本机地址则丢弃。发往本机的帧包括: 131 | 1. 单播帧,一对一,帧的目的地址和本机 MAC 地址相同。 132 | 2. 广播帧,一对全体,即发给本局域网上所有站点的帧。 133 | 3. 多播帧,一对多,即发往本局域网上一部分站点的帧。 134 | 135 | 所有的适配器至少要能识别出单播和广播地址,有的适配器可用编程方法识别多播地址。工作在混杂方式的适配器,可以接收所有的帧,而不管这些帧发往哪个地址。 136 | 137 | #### MAC 帧的格式 138 | 常用的帧包括 DIX Ethernet V2 标准和 IEEE 的 802.3 标准,这里只介绍前者。 139 | 140 | ![](../imgs/ll7.png) 141 | 142 | 1. 目的地址和源地址为 6 字节。 143 | 2. 类型字段为 2 字节,用来标志上一层用的是什么协议。0x0800 代表 IP 数据报,0x8137 表示 IPX。 144 | 3. 数据字段在 46 - 1500 字段,46 字节是最小长度 - 18 字节的首部和尾部得出的。 145 | 4. FCS 是帧检验序列,用于 CRC 检验。 146 | 147 | 在将 MAC 帧传给物理层时还要向帧的前面插入 8 个字节。第一个字段是 7 字节的前同步码(1 和 0 交替),用于让接收的适配器能够迅速调整其时钟频率; 148 | 第二个字段是 1 字节的帧开始定界符,用于告诉接收端适配器 MAC 帧的信息马上要来了,请做好准备。使用 SONET/SDH 进行同步传输时则不需要前同步码。 149 | 150 | 如果出现以下情况,接收的帧将被丢弃: 151 | 1. 帧的长度不是整数个字节。 152 | 2. 帧检验序列 FCS 查出有差错。 153 | 3. 帧的 MAC 客户数据字段长度不在 46-1500 字节之间。考虑到帧首部和尾部有 18 个字节,可以得出有效的帧长度为 64-1518 字节之间。 154 | 155 | ## 扩展的以太网 156 | 以太网上的主机不能超过太远,否则信号会衰减到使 CSMA/CD 协议无法正常工作。 157 | 158 | ### 以太网交换机 159 | 交换机的特点是有多个接口、并行性、全双工,能同时连通多台主机,使多对主机同时进行通信,并且相互通信的主机都是独占传输媒体,无碰撞地传输数据。 160 | 161 | 交换机转发方式有两种:存储转发(缓存再转发)、直通(不缓存)。 162 | 163 | #### 交换机自学习功能 164 | ![](../imgs/ll8.png) 165 | 166 | 为了防止帧在交换机之间兜圈子,IEEE802.1D 标准制定了一个生成树协议。其要点是不改变网络的实际拓扑,但在逻辑上切断某些链路,从而消除了兜圈子现象。 167 | 168 | ![](../imgs/ll9.png) 169 | 170 | 总线以太网使用 CSMA/CD 协议,以半双工的方式工作。但以太网交换机不使用共享总线,没有碰撞问题,因此不使用 CSMA/CD 协议,而是以全双工的方式工作。 171 | 之所以还叫以太网,是因为它的帧结构未变,仍采用以太网帧的结构。 172 | 173 | ### 虚拟局域网 174 | 利用交换机可以人为的将局域网划分为几个虚拟局域网(VLAN),它是局域网提供给用户的一种服务。 175 | 176 | IEEE802.3ac 标准定义了以太网帧格式的扩展,以便支持虚拟局域网。虚拟局域网协议允许在以太网帧插入一个 4 字节的标识符,称为 VLAN 标记。 177 | 用来指明发送该帧的计算机属于哪个虚拟局域网,插入 VLAN 标记的帧称为 802.1Q 帧。 178 | 179 | ![](../imgs/ll10.png) 180 | 181 | ## 高速以太网 182 | ### 100BASE-T 以太网 183 | 100BASE-T 是在双绞线上传送 100M/S 基带信号的星形拓扑以太网,仍使用 IEEE802.3 的 CSMA/CD 协议,又称为快速以太网。 184 | 它也可以使用交换机从而工作在全双工方式。快速以太网在 95 年被 IEEE 定为标准,代号为 IEEE 802.3u。 185 | 186 | ### 吉比特以太网 187 | 吉比特以太网标准 IEEE 802.3z 特点: 188 | 1. 允许在 1G/S 下以全双工和半双工两种方式工作。 189 | 2. 使用 IEEE802.3 协议规定的帧格式。 190 | 3. 在半双工下使用 CSMA/CD 协议,在全双工下不使用 CSMA/CD 协议。 191 | 4. 与 10BASE-T 和 100BASE-T 技术向后兼容。 192 | 193 | ### 10 吉比特以太网和更快的以太网 194 | 10GE 只工作在全双工方式,不使用 CSMA/CD 协议。 -------------------------------------------------------------------------------- /docs/http/4.md: -------------------------------------------------------------------------------- 1 | # 连接管理 2 | ## TCP 连接 3 | ### TCP 的可靠数据通道 4 | TCP 为 HTTP 提供了一条可靠的比特传输管道。从 TCP 连接一端填入的字节会从另一端以原有的顺序、正确地传送过来。 5 | 6 | ![](imgs/h4-1.png) 7 | 8 | ### TCP流是分段的、由 IP 分组传送 9 | TCP 报文段通过 IP 分组(数据报)发送。 10 | 11 | ![](imgs/h4-2.png) 12 | 13 | HTTP 要传送一条报文时,会以流的形式将报文数据通过 TCP 按序传输。TCP 收到数据流之后,会将数据流分成被称作段的小数据块,并将段封装成 IP 分组中,通过因特网传输。 14 | 15 | ### 保持 TCP 连接的正确运行 16 | ![](imgs/h4-3.png) 17 | 18 | TCP 连接是通过 4 个值来识别的: 19 | ``` 20 | 源 IP 地址、源端口号、目的 IP 地址、目的端口号 21 | ``` 22 | 这 4 个值一起唯一地标识了一条 TCP 连接,两条不同的 TCP 连接不能拥有 4 个相同的地址组件值。 23 | 24 | ![](imgs/h4-4.png) 25 | 26 | 像上图中的 C 和 D,虽然它们的目的 IP 地址和目的端口号相同,但剩下两个字段值不同,所以是正确的。 27 | 28 | ### 用 TCP 套接字编程 29 | 操作系统提供了一系列套接字 API 供程序员操作 TCP。套接字 API 向 HTTP 程序员隐藏了 TCP 和 IP 的所有细节。 30 | 31 | ![](imgs/h4-5.png) 32 | 33 | 下图显示了浏览器是如何用 HTTP 获取 HTML 页面的。 34 | 35 | ![](imgs/h4-6.png) 36 | 37 | ## 对 TCP 性能的考虑 38 | ### HTTP 事务时延 39 | HTTP 处理时间线: 40 | 41 | ![](imgs/h4-7.png) 42 | 43 | 与建立 TCP 连接,以及传输请求和响应报文的时间比,事务处理时间可能是很短的。除非客户端或服务器超载,或处理复杂的资源,否则 HTTP 时延就是由 TCP 时延构成的。 44 | 45 | HTTP 事务的时延原因: 46 | 1. DNS 查询。 47 | 2. TCP 连接建立需要经历三次握手。 48 | 3. HTTP 请求传输以及服务器处理都需要时间。 49 | 4. 服务器把响应结果传输回来也要时间。 50 | 51 | ### 性能聚集区域 52 | 会对 HTTP 程序员产生影响、最常见的 TCP 相关时延,其中包括: 53 | 1. TCP 连接建立握手。 54 | 2. TCP 慢启动拥塞。 55 | 3. 数据聚集的 Nagle 算法。 56 | 4. 用于捎带确认的 TCP 延迟确认算法。 57 | 5. TIME_WAIT 时延和端口耗尽。 58 | 59 | ### TCP 连接建立的握手时延 60 | ![](imgs/h4-8.png) 61 | 62 | 在建立 TCP 连接时,TCP 之间会交换一系列的分组用来沟通有关参数。如果连接只用来交换少量数据,这些交换过程就会严重降低 HTTP 性能。 63 | 64 | ### 延迟确认 65 | TCP 发送后需要收到 TCP 接收方发回的 ACK 确认报文才能确认这个报文段被对方收到。如果在规定时间内没有收到确认信息就会重传刚才发送的报文段。 66 | 由于确认报文很小,所以 TCP 允许在发往相同方向的输出数据分组中对其进行“捎带”,这样可以更有效地利用网络。 67 | 68 | 为了增加确认报文找到同向传输数据分组的可能性,很多 TCP 栈都实现了一种“延迟确认”算法。延迟确认算法会在一个特定的窗口时间(通常为 100 ~ 200 毫秒)内将确认信息存放在缓冲区中,以寻找能够捎带它的输出数据分组。如果在那个时间段内没有输出数据分组,就将确认信息放在单独的分组中发送。 69 | 70 | 但是 HTTP 具有双峰特征的请求-应答行为降低了捎带信息的可能性。当希望有相反方向回传分组的时候,偏偏没有那么多。 71 | 通常,延迟确认算法会引入相当大的时延。根据操作系统的不同,我们可以调整或禁止延迟确认算法。 72 | 73 | ### TCP 慢启动 74 | 为了防止因特网突然过载和拥塞,TCP 在一开始能传输的数据很少,每成功发送一个分组并收到确认信息,就可以将发送数据量翻倍,直到达到阈值才减少。 75 | 76 | ### Nagle 算法和 TCP_NODELAY 77 | Nagle 算法试图在发送一个分组这前,将大量 TCP 数据捆绑在一起,以提高网络效率。 78 | 79 | Nagle 算法发送过程: 80 | 1. 发送方把第一个字节发送出去,把后面到达的字节缓存起来。 81 | 2. 在收到对第一个字节的确认后,再把缓存中的数据组装成一个报文段发送出去,随后继续缓存数据。 82 | 3. 只有收到对前一个报文段的确认后,才会继续发送下一个报文段。 83 | 4. 另外,如果缓存数据达到发送窗口的一半或者达到报文段的最大长度时,就立即发送一个报文段。 84 | 85 | Nagle 算法会引发几种 HTTP 性能问题。首先,小的 HTTP 报文可能无法填满一个分组,可能会因为等待那些永远不会到来的确认分组而产生时延。 86 | 其次,Nagle 算法与延迟确认之间的交互存在问题——Nagle 算法会阻止数据的发送,直到收到一个确认分组,但确认分组自身会被延迟确认算法延迟 100 ~ 200 毫秒。 87 | 88 | HTTP 应用程序可以在自己的栈中设置参数 TCP_NODELAY,禁用 Nagle 算法,提高性能。 89 | 90 | ### TIME_WAIT 累积 91 | 当 TCP 关闭连接时,会在内存中维护一个小的控制块,用来记录最近所关闭连接的 IP 地址和端口号。这类信息只会维持一小段时间,通常是最大分段使用期的两倍(称为 2MSL,通常为 2 分钟)左右,以确保在这段时间内不会创建具有相同地址和端口号的新连接。 92 | 93 | 有些操作系统将 2MSL 设置为一个较小的值,但超过此值时要特别小心。如果来自之前连接的复制分组插入了具有相同连接值的新 TCP 流,会破坏 TCP 的数据。 94 | 95 | ## HTTP 连接的处理 96 | ### 常被误解的 Connection 首部 97 | HTTP 的 Connection 首部字段(逐跳首部)中有一个由逗号分隔的**连接标签**列表,这些标签指定了一些不会传播到其他连接中去的选项。 98 | 99 | Connection 首部可以承载 3 种不同类型的标签: 100 | 1. HTTP 首部字段名,列出了只与此连接有关的首部。 101 | 2. 任意标签值,用于描述此连接的非标准选项。 102 | 3. close,说明操作完成后要关闭此连接。 103 | 104 | 如果 HTTP 应用程序收到一条包含 Connection 首部字段的报文时,接收端会解析并应用发送端请求的所有选项。在将此连接转发出去前,删除 Connection 首部以及 Connection 中列出的所有首部。 105 | 106 | ![](imgs/h4-9.png) 107 | 108 | ### 串行事务处理时延 109 | 串行事务处理就是处理完一个请求再处理下一个请求,这会造成时延过大的问题。 110 | 现在有几种解决办法: 111 | 1. 并行连接,通过多条 TCP 连接发起并发的 HTTP 请求。 112 | 2. 持久连接,重用 TCP 连接,以消除连接及关闭时延。 113 | 3. 管道化连接,通过共享的 TCP 连接发起并发的 HTTP 请求。 114 | 4. 复用的连接,交替传送请求和响应报文。 115 | 116 | ## 并行连接 117 | 并行连接的速度不一定更快。假如客户端网络带宽不足,并行加载多个对象时,每个对象都去竞争有限的带宽,每个对象都会以较慢的速度按比例加载,这样可能就没什么性能提升。 118 | 而且,打开大量的连接会消耗很多内存资源,从而引发自身的性能问题。实际上,浏览器会限制并行连接的数量。 119 | 120 | ## 持久连接 121 | HTTP/1.1 允许 HTTP 设备在事务处理结束之后将 TCP 连接保持在打开状态,以便为将来的 HTTP 请求重用现存的连接,这种连接称为持久连接。非持久连接会在每个事务处理结束之后关闭,而持久连接会在不同事务之间保持打开状态,直到客户端或服务器决定将其关闭为止。 122 | 123 | ### 持久及并行连接 124 | 并行连接缺点: 125 | 1. 每个事务都会打开/关闭一个 TCP 连接,会耗费时间和带宽。 126 | 2. 由于 TCP 慢启动特性的存在,每条新连接的性能都会有所降低。 127 | 3. 可打开的并行连接数量有限。 128 | 129 | 持久连接降低了时延和连接建立的开销,而且减少了打开连接的潜在数量。持久连接和并行连接配合使用可能是最高效的方式。 130 | 现在很多 Web 应用程序都会打开少量的并行连接,其中的每一个都是持久连接。持久连接有两个类型: 131 | 1. HTTP/1.0 + "keep-alive"。 132 | 2. HTTP/1.1 "persistent" 连接,默认就是持久连接。 133 | 134 | ### Keep-Alive 135 | Keep-Alive 是一个通用消息头,允许消息发送者暗示连接的状态,还可以用来设置超时时长和最大请求数。 136 | 可以用 Keep-Alive 通用首部中指定的、由逗号分隔的选项来调节 Keep-Alive 的行为: 137 | 1. 参数 timeout,指定了一个空闲连接需要保持打开状态的最小时长(以秒为单位)。需要注意的是,如果没有在传输层设置 keep-alive TCP message 的话,大于 TCP 层面的超时设置会被忽略。 138 | 2. 参数 max,在连接关闭之前,在此连接可以发送的请求的最大值。在非管道连接中,除了 0 以外,这个值是被忽略的,因为需要在紧跟着的响应中发送新一次的请求。HTTP 管道连接则可以用它来限制管道的使用。 139 | 3. Keep-Alive 支持任意未经处理的属性,这些属于主要用于诊断和调试。语法为 name[=value]。 140 | 141 | Keep-Alive 首部是可选的,只有在 Connection: Keep-Alive 时才生效。同时需要注意的是,在 HTTP/2 协议中, Connection 和 Keep-Alive 是被忽略的;在其中采用其他机制来进行连接管理。 142 | 143 | ![](imgs/h4-10.png) 144 | 145 | ### Keep-Alive 与哑代理 146 | ![](imgs/h4-11.png) 147 | 148 | 在上图中,客户端和服务器都收到了 keep-alive 的请求或响应,所以连接一直保持打开状态。但由于哑代理不理解 Connection 首部的意思,所以也不知道连接一直保持着打开状态。在完成一次请求后,就一直挂在那等着源端或服务器关闭连接,它不会认为同一连接还会有其他请求到来。当客户端新请求到达时,请求被忽略,浏览器就一直在转圈,不会有任何进展。 149 | 150 | 为了避免此类代理通信问题的发生,现代的代理都绝不能转发 Connection 首部和所有名字出现在 Connection 值中的首部。 151 | 另外还有几个不能作为 Connection 首部值列出,也不能被代理转发或作为缓存响应使用的首部。 152 | 其中包括 Proxy-Authenticate、Proxy-Connection、Transfer-Encoding、Upgrade。 153 | 154 | ### HTTP/1.1 持久连接 155 | HTTP/1.1 逐渐停止了对 Keep-Alive 连接的支持,用一种名为持久连接(persistent connection)的改进型设计取代了它。持久连接的目的与 Keep-Alive 连接的目的相同,但工作机制更优一些。HTTP/1.1 持久连接在默认下是激活的,如果要在事务处理之后将连接关闭,应用程序必须向报文显示地添加一个 Connection: close 首部。 156 | 157 | ### 持久连接的限制和规则 158 | * 只有当连接上所有的报文都有正确的、自定义报文长度时——也就是说,实体主体部分的长度都和相应的 Content-Length 一致,或者是用分块传输编码方式编码的——连接才能持久保持。 159 | * 除非重复发起请求会产生副作用,否则如果在客户端收到整条响应之前连接关闭了,客户端就必须重新发起请求。 160 | 161 | ## 管道化连接 162 | HTTP/1.1 允许在持久连接上可选地使用请求管道。在响应到达之前,可以将多条请求放入队列。当第一条请求通过网络流向服务器时,第二条和第三条请求也可以开始发送了。 163 | 164 | ![](imgs/h4-12.png) 165 | 166 | ![](imgs/h4-13.png) 167 | 168 | ## 关闭连接的奥秘 169 | 所有 HTTP 客户端、代理、服务器都可在任意时刻关闭 TCP 连接。通常会在一条报文结束时关闭连接,但出错的时候,也可能在首部行的中间或其他任意位置关闭连接。 170 | 171 | 副作用是很重要的问题,如果连接非正常关闭了,有些事务可以重新发起请求,有些事务则不行。例如 GET 一个静态页面,就可以反复执行多次;向一个在线书店 POST 一个订单就不能重复执行。 172 | 173 | ### 幂等性 174 | 如果一个事务不管执行多少次,其结果都是一样的,这个事务就是**幂等的**。客户端不应该用管道化方式传送非幂等请求(比如 POST),否则,传输连接的过早终止就会造成一些不确定的后果。 175 | 176 | ### 正常关闭连接 177 | 每个 TCP 连接都有一个输入和输出信道,用于数据的读或写。应用程序可以关闭 TCP 输入和输出信道中的任意一个,或者两者都关闭了。 178 | 套接字调用 close() 会将 TCP 连接的输入和输出信道都关闭了,这称为“完全关闭”。套接字调用 shutdown() 单独关闭输入或输出信道,这称为“半关闭”。 179 | 180 | ![](imgs/h4-14.png) 181 | 182 | HTTP 规范建议,当客户端或服务器突然要关闭连接时,应该要“正常地关闭传输连接”,但它并没有说明要如何去做。 183 | 184 | 实现正常关闭的应用程序应该首先关闭它的输出信道,然后周期性地检查其输入信道的状态(查找数据,或流的末尾),等待另一端关闭它的输出信道。如果在一定的时间区间内对端没有关闭输出信道,应用程序可以强制关闭连接,以节省资源。 -------------------------------------------------------------------------------- /docs/tcp.md: -------------------------------------------------------------------------------- 1 | # TCP 文档 2 | ## 特点 3 | * 全双工 4 | * 点对点(一对一) 5 | * 可靠数据传输 6 | * 传输字节流(把应用层数据看成一连串的无结构的字节序列,TCP 不知道所传送字节流的含义) 7 | * 拥有拥塞控制机制 8 | 9 | ## TCP 报文段结构 10 | TCP 报文由首部字段和数据字段两部分组成。 11 | 12 | ![](https://github.com/woai3c/Computer-Networking-Lab/blob/master/imgs/tcp.png) 13 | ### 首部字段 14 | #### 1. 源端口号和目的端口号 15 | 用于多路复用/分解 16 | #### 2. 32 比特的序号字段和确认号字段 17 | 用于实现可靠数据传输服务。TCP 字节流每一个字节都按顺序编号。确认号是接收方期望从发送方收到的下一字节的序号。 18 | #### 3. 16 比特的接收窗口字段 19 | 告诉对方自己的接收窗口大小。 20 | 21 | 发送方维护一个称为接收窗口(rwnd)的变量用来提供流量控制,提示接收方还有多少可用的缓存空间。 22 | 23 | 接收窗口 = 接收方缓存 - (接收方已放入接收缓存中的数据流的最后一个字节编号 - 接收方应用程序已读取的最后一个字节编号)。 24 | 25 | TCP 为每个连接设有一个持续计时器,只要收到零窗口(接收窗口为零,表示没有缓存空间了)通知,就启动计时器。若计时器到期了,就发送一个零窗口 26 | 探测报文(携带 1 字节数据),对方确认时会给出现在的窗口值,如果窗口仍是零,重新启动计时器。 27 | 28 | ![](https://github.com/woai3c/Computer-Networking-Lab/blob/master/imgs/recBuffer.png) 29 | #### 4. 4 位的数据偏移 30 | 指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远,实际上指出了 TCP 报文段的首部长度。 31 | #### 5. 可选与变长的选项字段 32 | 用于双方协商最大报文段长度(MSS)时使用,或在高速网络环境下用作窗口调节因子时使用。 33 | #### 6. 6 比特的标志字段 34 | PSH URG 一般不使用 35 | * ACK 用于指示确认字段中的值是有效的 ACK=1 有效 ACK=0 无效。 36 | * RST 重置报文段,释放连接,再重新建立连接。还用来拒绝打开一个连接或非法报文段。 37 | * SYN 用于连接建立,SYN 为 1 时,表明这是一个请求建立连接报文。 38 | * FIN 用于连接拆除,FIN 为 1 时,表明发送方数据已发送完毕,并要求释放连接。 39 | * PSH 被设为 1 时,表示接收方应立即将数据交给上层,而不要等缓存填满了再上交。 40 | * URG 表示报文段存在被发送方上层置为“紧急”的数据 41 | 42 | #### 7. 选项 43 | 长度可变,最多 40 字节,没有选项时,TCP 首部长度为 20 字节。 44 | 45 | 1. 选项字段有一个窗口扩大选项,占 3 字节。其中有一个字节表示移位值 S,新的窗口值等于 TCP 首部中的窗口位数从 16 增大到 16 + S。移位值最大值为 14, 46 | 相当于窗口最大值增加到 2**30 - 1。窗口扩大选项在双方连接建立时进行协商,如果不需要扩大窗口,发送 S = 0,使窗口大小回到 16 位。 47 | 48 | 2. 时间戳选项占 10 字节,其中时间戳值字段(4 字节),时间戳回送回答字段(4 字节)。时间戳选项有两个功能,一是用来计算往返时间 RTT;二是用于处理 TCP 49 | 序号超过 2**32 的情况,这称为防止序号绕回 PAWS。当序号超过上限值时,会从 0 重新开始计算。 50 | 51 | ## 连接建立过程(三次握手) 52 | TCP 标准规定,ACK 报文段可以携带数据,但不携带数据就不用消耗序号。 53 | 1. 客户端发送一个不包含应用层数据的 TCP 报文段,首部的 SYN 置为 1,随机选择一个初始序号放在 TCP 报文段的序号字段中。(SYN 为 1 的时候,不能携带数据,但要消耗掉一个序号) 54 | 2. TCP 报文段到达服务器主机后,提取报文段,为该 TCP 连接分配缓存和变量,并向客户端发送允许连接的 TCP 报文段(不包含应用层数据)。 55 | 这个报文段的首部包含 3 个信息:SYN 置为 1;确认号字段置为客户端的序号 + 1;随机选择自己的初始序号。 56 | 3. 收到服务器的 TCP 响应报文段后,客户端也要为该 TCP 连接分配缓存和变量,并向服务器发送一个报文段。这个报文段将服务器端的序号 + 1 放置在确认号字段中, 57 | 用来对服务器允许连接的报文段进行响应,因为连接已经建立,所以 SYN 置为 0。 58 | 最后一个阶段,报文段可以携带客户到服务器的数据。并且以后的每一个报文段,SYN 都置为 0。 59 | 60 | ## 连接拆除过程 61 | FIN 报文段即使不携带数据,也要消耗序号。 62 | 1. 客户端发送一个 FIN 置为 1 的报文段。 63 | 2. 服务器回送一个确认报文段。 64 | 3. 服务器发送 FIN 置为 1 的报文段。 65 | 4. 客户端回送一个确认报文段。 66 | 67 | * [TCP为什么是四次挥手,而不是三次?](https://www.zhihu.com/question/63264012) 68 | 69 | ## 发送与接收过程 70 | ### 发送 71 | TCP 发送方仅需维护已发送但未确认的字节的最小序号(SendBase)和下一个要发送的字节的序号(NextSeqNum)。 72 | 1. 客户进程通过套接字将数据传给 TCP,TCP 将数据放到该连接的发送缓存,接下来 TCP 会不时的从发送缓存里取出一块数据发送。 73 | 2. 发送时 TCP 会为数据加上 TCP 首部,从而形成报文段。 74 | 3. 报文段下发到网络层,网络层将其封装成 IP 数据报,最后经历链路层、物理层发送到网络中。 75 | 76 | ### 接收 77 | TCP 接收方会将正确接收但失序的报文缓存起来。 78 | 1. 接收时从物理层、链路层、网络层一路解包,最后到达传输层。 79 | 2. TCP 接收后会放到该连接的接收缓存, 80 | 3. 应用程序通过套接字从此缓存读取数据流。 81 | 82 | ## TCP 报文段发送时机 83 | 有三种发送机制 84 | 1. TCP 维持一个变量,它等于 MSS,只要缓存中的数据达到 MSS 字节时,就组装成一个 TCP 报文段发送出去。 85 | 2. 由发送方的应用进程指明要求发送报文段,即 TCP 支持的推送操作。 86 | 3. 发送方的一个计时器时限到了,这时就把当前已有的缓存数据装入报文段(不能超过 MSS)发送出去。 87 | 88 | 在 TCP 的实现中广泛采用 Nagle 算法 89 | 1. 发送方把第一个字节发送出去,把后面到达的字节缓存起来 90 | 2. 在收到对第一个字节的确认后,再把缓存中的数据组装成一个报文段发送出去,随后继续缓存数据 91 | 3. 只有收到对前一个报文段的确认后,才会继续发送下一个报文段 92 | 4. 另外,如果缓存数据达到发送窗口的一半或者达到报文段的最大长度时,就立即发送一个报文段 93 | 94 | Nagle 算法会引发几种 HTTP 性能问题。首先,小的 HTTP 报文可能无法填满一个分组,可能会因为等待那些永远不会到来的确认分组而产生时延。 95 | 其次,Nagle 算法与延迟确认之间的交互存在问题——Nagle 算法会阻止数据的发送,直到收到一个确认分组,但确认分组自身会被延迟确认算法延迟 100 ~ 200 毫秒。 96 | 97 | HTTP 应用程序可以在自己的栈中设置参数 TCP_NODELAY,禁用 Nagle 算法,提高性能。 98 | ## 名词解释 99 | ### 1. MSS 100 | 最大报文段长度,指报文段应用层数据的最大长度,不包括 TCP 头部,MSS 值和接收窗口没有关系。 101 | 102 | ### 2. MTU 103 | 最大链路层帧长度,以太网和 PPP 链路层协议具有 1500 字节的 MTU,因此 MSS 的典型值为 1460 字节(TPC/IP 首部长度通常为 40 字节)。 104 | 105 | ### 3. 路径 MTU 106 | 指从源到目的地的所有链路层上,所能发送的最大链路层帧 107 | 108 | ### 4. 累积确认和选择确认 109 | #### 累积确认 110 | TCP 只确认从流开始到第一个丢失字节为止的字节,所以被称为累积确认。 111 | 112 | 假如发送方发送了 0-10,11-20,21-30 三个报文段,接收方由于某种原因只收到 0-10 和 21-30 字段,所以它下一个报文段的确认号为 11,表示期望收到字节 11(及以后)。 113 | 114 | 接收方不必对每个接收到的分组逐个发送确认,而是在收到几个分组后,对按序到达的最后一个分组发送确认,表示到这个分组为止的所有分组都已收到了。 115 | #### 选择确认 116 | 要使用选择确认,必须在建立连接时,在首部选项中加上允许 SACK 的选项,双方都协商好。然而 SACK 文档没有指明发送方要怎么响应 SACK,所以大多数的实现还是重传所有 117 | 未被确认的数据块。 118 | 119 | ### 5. 重传 120 | TCP 重传具有最小序号的还未被确认的报文段。 121 | 122 | ### 6. 重传超时间隔 123 | 它被设置为平均往返时间加上一点余量。重传发生后,下一次的超时间隔被设置为之前的两倍。 124 | 125 | ### 7. 快速重传 126 | 当接收方接收到一个比期望序号大的失序报文时,说明有报文段丢失,接收方将对最后一次按序字节数据进行重复确认(产生一个冗余 ACK)。 127 | 因为发送方是流水线式(一个接一个)发送报文,如果一个报文段丢失,很可能会引起多个冗余的 ACK。当发送方接收到对相同数据的 3 个冗余 ACK 时, 128 | 表明这个确认过 3 次的报文段已经丢失,发送方就执行快速重传,即在定时器过期之前重传丢失的字段。 129 | 130 | 131 | ### 8. 拥塞控制 132 | 拥塞控制就是防止过多的数据注入网络,这样可以使网络中的路由或链路不过载。拥塞控制是一个全局性的过程,涉及所有的主机、路由器, 133 | 以及与降低网络传输性能有关的所有因素。 134 | 135 | 而流量控制是指点到点通信量的控制,是个端到端的问题。流量控制抑制发送端的发送速率,以使接收端来得及接收。 136 | 137 | 如何判断发生了拥塞?TCP 发生丢包就是出现了拥塞。 138 | 139 | 丢包事件:超时或者收到接收方的 3 个冗余 ACK。 140 | 141 | ### 9. 拥塞窗口(cwnd) 142 | 发送方维护的一个额外变量,它对 TCP 发送流量速率进行了限制,在发送方中未被确认的数据量不会超过 cwnd 和 rwnd 中的最小值。 143 | TCP 使用确认(成功收到接收方的 ACK)来触发增大它的拥塞窗口长度。 144 | 145 | ### 10. 拥塞控制算法 146 | 慢启动和拥塞避免是 TCP 的强制部分,两者的区别在于对收到的 ACK 做出反应时增加 cwnd 长度的方式。 147 | 慢启动比拥塞避免能更快地增加 cwnd 的长度。快速恢复是推荐部分,对于 TCP 发送方不是必需的。 148 | 149 | #### (1) 慢启动 150 | 151 | 慢启动 cwnd 初始值设为较小的值,每收到一个接收方的 ACK,就将 cwnd 的值翻倍(指数增长)。 152 | 153 | 结束慢启动有两种方式,一是当检查到拥塞时,这时将 ssthresh(慢启动阈值) 设为 cwnd/2,然后将 cwnd 置为 1 个 MSS,并重新开启慢启动。 154 | 二是到达或超过 ssthresh 值时,再翻倍就超过 cwnd 的值了,所以这时结束慢启动进入拥塞避免模式。 155 | 156 | 157 | #### (2) 拥塞避免 158 | 拥塞避免模式,每个 RTT 将 cwnd 的值增加一个 MSS。 159 | 160 | 结束拥塞避免有两种方式,第一种是超时,它和结束慢启动的方式一相同。第二种是收到 3 个冗余 ACK 时,将 ssthresh 置为 cwnd/2, 161 | 然后 cwnd = ssthresh + 3 * MSS, 接下来进入快速恢复模式。 162 | 163 | 164 | #### (3) 快速恢复 165 | 166 | 在快速恢复阶段,每收到重复的ACK,则cwnd加1;收到非重复ACK时,置cwnd = ssthresh, 167 | 转入拥塞避免阶段;如果发生超时重传,则置ssthresh为当前cwnd的一半,cwnd = 1,重新进入慢启动阶段。 168 | 169 | 快速恢复阶段退出条件:收到非重复ACK。 170 | ``` 171 | step1: 172 | if ( dupacks >= 3 ) { 173 | ssthresh = max( 2 , cwnd / 2 ) ; 174 | cwnd = ssthresh + 3 * SMSS ; 175 | } 176 | 177 | step2:重传丢失的分组 178 | 179 | step3:此后每收到一个重复的ACK确认时,cwnd++ 180 | 181 | step4:当收到对新发送数据的ACK确认时,cwnd = ssthresh,这个ACK能够对那些在 182 | 丢失的分组之后,第一个重复ACK之前发送的所有包进行确认。 183 | ``` 184 | ### 11. 发送窗口 185 | 发送窗口里面的序号表示允许发送的序号,只有收到接收方的确认报文段,才能往前移动(继续发送序号大的报文)。 186 | 187 | ![](https://github.com/woai3c/Computer-Networking-Lab/blob/master/imgs/sendwindow.jpg) 188 | 189 | ### 12. 套接字 190 | 套接字 socket = (IP 地址:端口号) 191 | 192 | TCP 连接 = { (ip1:port1), (ip2:port2) } 193 | 194 | ### 13. 延迟确认 195 | TCP 发送后需要收到 TCP 接收方发回的 ACK 确认报文才能确认这个报文段被对方收到。如果在规定时间内没有收到确认信息就会重传刚才发送的报文段。 196 | 由于确认报文很小,所以 TCP 允许在发往相同方向的输出数据分组中对其进行“捎带”,这样可以更有效地利用网络。 197 | 198 | 为了增加确认报文找到同向传输数据分组的可能性,很多 TCP 栈都实现了一种“延迟确认”算法。延迟确认算法会在一个特定的窗口时间(通常为 100 ~ 200 毫秒)内将确认信息存放在缓冲区中,以寻找能够捎带它的输出数据分组。如果在那个时间段内没有输出数据分组,就将确认信息放在单独的分组中发送。 199 | 200 | 但是 HTTP 具有双峰特征的请求-应答行为降低了捎带信息的可能性。当希望有相反方向回传分组的时候,偏偏没有那么多。 201 | 通常,延迟确认算法会引入相当大的时延。根据操作系统的不同,我们可以调整或禁止延迟确认算法。 202 | 203 | ### 14. TIME_WAIT 累积 204 | 当 TCP 关闭连接时,会在内存中维护一个小的控制块,用来记录最近所关闭连接的 IP 地址和端口号。这类信息只会维持一小段时间,通常是最大分段使用期的两倍(称为 2MSL,通常为 2 分钟)左右,以确保在这段时间内不会创建具有相同地址和端口号的新连接。 205 | 206 | 有些操作系统将 2MSL 设置为一个较小的值,但超过此值时要特别小心。如果来自之前连接的复制分组插入了具有相同连接值的新 TCP 流,会破坏 TCP 的数据。 207 | 208 | [谈谈 TCP 的 TIME_WAIT](https://zhenbianshu.github.io/2018/12/talk_about_tcp_timewait.html) 209 | --------------------------------------------------------------------------------