Web权威指南
推荐序
合格的开发者知道怎么做, 而优秀的开发者知道为什么要这么做
# 第一部分: 网络技术概览
1. 延迟与带宽
了解上网服务商的拓扑结构和速度
> traceroute xxx.com
traceroute: Warning: xxx.com has multiple addresses; using 183.60.209.24
traceroute to xxx.com (183.60.209.24), 64 hops max, 52 byte packets
traceroute to google.com (172.217.25.14), 64 hops max, 52 byte packets
1 10.0.0.1 (10.0.0.1) 4.473 ms 4.759 ms 3.733 ms
2 192.168.254.68 (192.168.254.68) 4.206 ms 3.570 ms 4.085 ms
3 192.168.254.23 (192.168.254.23) 4.441 ms 4.853 ms 3.952 ms
4 14.152.49.249 (14.152.49.249) 46.490 ms 14.372 ms 16.516 ms
5 * * *
6 * * *
7 * * *
8 * * *
9 * * *
10 10.10.71.2 (10.10.71.2) 24.394 ms 17.472 ms 18.060 ms
11 175.100.203.25 (175.100.203.25) 20.229 ms 20.522 ms 19.824 ms
12 218.189.124.225 (218.189.124.225) 37.908 ms
218.189.124.241 (218.189.124.241) 21.810 ms 21.892 ms
13 218.189.124.141 (218.189.124.141) 23.584 ms 21.721 ms 21.860 ms
14 218.189.97.249 (218.189.97.249) 24.059 ms 21.550 ms 22.099 ms
15 72.14.222.9 (72.14.222.9) 21.824 ms 20.306 ms 20.880 ms
16 108.170.241.33 (108.170.241.33) 21.993 ms 23.523 ms
108.170.241.1 (108.170.241.1) 23.155 ms
17 209.85.243.23 (209.85.243.23) 30.519 ms 24.920 ms
209.85.243.21 (209.85.243.21) 22.920 ms
18 hkg07s24-in-f14.1e100.net (172.217.25.14) 24.537 ms 27.017 ms 22.004 ms
2. TCP的构成
TCP负责在不可靠的传输通道之上提供可靠的抽象层, 向应用层隐藏了大多数网络通信的复制细节
例如丢包重发、按序发送、拥塞控制及避免、数据完整等等
2.1 三次握手
所有TCP连接一开始都经过3次握手
发送端 接收端 SYN(x=rand())-------> <-------SYN ACK(x+1 y=rand()) ACK(y+1 x+1) ------->
SYN: 客户端选择一个随机序列号x, 并发送一个SYN分组 , 其中可能还包括其他TCP标志和选项
SYN ACK: 服务器端给x加1, 并选择自己的一个随机序列号y, 追加自己的标记和选项, 然后返回响应
ACK: 客户端给x和y都加以, 并发送握手期间最后一个ACK分组
三次握手完成后, 客户端与服务器之间就可以通信了
客户端可以在发送了ACK后立即发送数据
而服务器必须要等接收到ack分组之后才能发送数据
三次握手带来的延迟使得每创建一个新TCP都要付出代价, 而这也决定了提高TCP应用性能的关键, 在于想办法重用连接
2.4 队首阻塞
每个TCP分组都会带着一个唯一的序列号被发送
而所有分组必须按顺序传送到接收端
如果中途有一个分组没能到接受端, 那么后续分组必须保持在接收端的TCP缓存区
应用程序一无所知, 只能通过套接字读数据时感觉到延迟交付, 这就叫TCP的队首阻塞
有些程序并不需要可靠的交付或者按顺序的交付, 比如每个分组都是独立的消息, 那么按顺序交付就没任何必要
或者每个消息都会覆盖之前的消息, 那么可靠的交付同样也没必要
可惜的是 TCP不支持这种情况, 所有分组必须按顺序交付
无需按序交付数据或能够处理分组丢失的应用程序, 以及对延迟或抖动要求很高的应用程序, 最好选择UDP等协议