网络总结
TCP/IP四层协议
- 应用层:HTTP、FTP、SMTP、POP3、DNS...
- 传输层:TCP、UDP
- 网络层:ICMP、IP
- 网络接口层:ARP、RARP、IEEE802、FDDI...
DNS
DNS服务器层次结构
DNS的层级结构如下
- 根DNS服务器:记录每个顶级域名DNS服务器的地址
- 顶级DNS服务器(TLD):记录各个权威DNS服务器的地址
- 权威服务器:各个接入网络的权威机构提供的DNS服务器
DNS请求路径
- 主机请求本地ISP的DNS服务器,它将你的请求转发到DNS服务器层次结构中的根DNS服务器
- 根DNS服务器通过你域名的结尾找到TLD DNS服务器
- TLD DNS服务器根据详细的域名找到相应负责的权威DNS服务器
- 权威DNS服务器解析域名的IP
除了本地ISP这一环节,DNS请求路径是自顶向下的。
DNS请求解析方式的不同
上面的四个步骤有可能是迭代的,有可能每一个服务器找到其它的DNS服务器后,直接返回一个NS记录给ISP DNS服务器,ISP再主动根据这个NS记录去找另一个DNS服务器,最终解析到一个A记录返回给你。
这个过程也有可能是递归的,每一个服务器向另一个服务器请求后直接拿到结果,各个DNS服务器逐层调用逐层返回。
DNS缓存
DNS提供缓存,当一个DNS服务器请求其它服务器进行解析时,会缓存解析的结果。
TCP
序号和确认号
- 序号:本次发送数据包载荷中第一个字节在所有内容中的偏移量
- 确认号:接收端用于表示它期望接受的下一个字节,在这个偏移量之前的数据都已经正确接收
连接管理
三次握手
略
四次挥手
具体过程略
注意四次挥手的主动发起方有一个2MSL(最大段生存周期)的TIME_WAIT
阶段用于等待被动方确认收到了自己的最后一个ACK。如果使用反向代理或其它需要服务器关闭TCP连接的技术,请注意这个问题,并使用如下方法解决:
- 使用keepalive连接
- 使用
SO_REUSEADDR
选项 - 设置内核参数,缩减
TIME_WAIT
阶段的时间
还有四次挥手是双方协商的过程,所以在FIN_WAIT_2
阶段也有可能由于被动关闭方不发送FIN而一直等待,在linux中,设置net.ipv4.tcp_fin_timeout
可以设置这个阶段的等待时间
ACK定时器设置——往返时间预测
- SampleRTT:采样某一次往返的时间
- EstimatedRTT:对
SampleRTT
进行加权平均运算得到的估计值,能更好的适应网络波动 - DevRTT:记录
SampleRTT
与计算后的EstimatedRTT
偏离的程度,该值展示了网络波动的程度,用于稍后在定时时间的计算中留出应对波动的余量
最终,ACK的往返时间为:\(EstimatedRTT + 4\times DevRTT\)
流量控制
用于在接收方接收速率低于发送方发送速率时遏制发送方的速率
在接收方ACK的头部的\(rwnd\)字段中,显示了它可用的缓存窗口还有多大:
而发送方要保证:
当发送方发现接收方的\(rwnd = 0\)时,它必须发送一个1字节的提醒报文,来通知接收方赶紧清空缓存,然后重新发送一个ACK报文段
拥塞控制
概述
由于网络层没提供任何支持,TCP只能根据一些拥塞发生时可能出现的现象,如丢包、超时、分组时延来作为判断拥塞的依据
就像\(rwnd\)代表接收端窗口,\(cwnd\)代表拥塞窗口,所以,发送方要保证:
当出现超时事件或冗余ACK时,发送方认为丢包发生了
而当:
- 超时或冗余ACK发生时,增加\(cwnd\)
- 正常ACK到达,减少\(cwnd\)
慢启动
\(cwnd\)直接代表了发送方的发送速率,在慢启动阶段,设置\(cwnd\)的初始值为\(1MSS\)(最大报文长度),然后每次接到正常ACK都将\(cwnd\)增加1MSS,这是一个指数级增长,因为发送速率变大也会导致接收速率变大
- 当发送速率到达\(ssthresh\)时,转移到拥塞避免模式
- 当检测到拥塞时,减少\(ssthresh=cwnd/2\),重启慢启动过程
- 检测到3个冗余ACK,执行快速重传,进入快速恢复状态
拥塞避免
这个阶段,每个RTT(往返时间)将\(cwnd\)增加1MSS
- 出现超时时,\(ssthresh=cwnd/2,cwnd=1MSS\)
- 出现3个冗余ACK,\(ssthresh=cwnd/2, cwnd=cwnd/2\),进入快速恢复状态
快速恢复
快速恢复阶段不是TCP必须要求实现的阶段,所以没学过