Loading

网络总结

TCP/IP四层协议

  1. 应用层:HTTP、FTP、SMTP、POP3、DNS...
  2. 传输层:TCP、UDP
  3. 网络层:ICMP、IP
  4. 网络接口层:ARP、RARP、IEEE802、FDDI...

DNS

DNS服务器层次结构

DNS的层级结构如下

img

  1. 根DNS服务器:记录每个顶级域名DNS服务器的地址
  2. 顶级DNS服务器(TLD):记录各个权威DNS服务器的地址
  3. 权威服务器:各个接入网络的权威机构提供的DNS服务器

DNS请求路径

  1. 主机请求本地ISP的DNS服务器,它将你的请求转发到DNS服务器层次结构中的根DNS服务器
  2. 根DNS服务器通过你域名的结尾找到TLD DNS服务器
  3. TLD DNS服务器根据详细的域名找到相应负责的权威DNS服务器
  4. 权威DNS服务器解析域名的IP

除了本地ISP这一环节,DNS请求路径是自顶向下的

DNS请求解析方式的不同

上面的四个步骤有可能是迭代的,有可能每一个服务器找到其它的DNS服务器后,直接返回一个NS记录给ISP DNS服务器,ISP再主动根据这个NS记录去找另一个DNS服务器,最终解析到一个A记录返回给你。

这个过程也有可能是递归的,每一个服务器向另一个服务器请求后直接拿到结果,各个DNS服务器逐层调用逐层返回。

DNS缓存

DNS提供缓存,当一个DNS服务器请求其它服务器进行解析时,会缓存解析的结果。

TCP

序号和确认号

  • 序号:本次发送数据包载荷中第一个字节在所有内容中的偏移量
  • 确认号:接收端用于表示它期望接受的下一个字节,在这个偏移量之前的数据都已经正确接收

连接管理

三次握手

四次挥手

具体过程略

注意四次挥手的主动发起方有一个2MSL(最大段生存周期)的TIME_WAIT阶段用于等待被动方确认收到了自己的最后一个ACK。如果使用反向代理或其它需要服务器关闭TCP连接的技术,请注意这个问题,并使用如下方法解决:

  1. 使用keepalive连接
  2. 使用SO_REUSEADDR选项
  3. 设置内核参数,缩减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=RcvBuffer - (LastByteRcvd - LastByteRead) \]

而发送方要保证:

\[LastByteSent - LastByteAcked \leq rwnd \]

当发送方发现接收方的\(rwnd = 0\)时,它必须发送一个1字节的提醒报文,来通知接收方赶紧清空缓存,然后重新发送一个ACK报文段

拥塞控制

概述

由于网络层没提供任何支持,TCP只能根据一些拥塞发生时可能出现的现象,如丢包、超时、分组时延来作为判断拥塞的依据

就像\(rwnd\)代表接收端窗口,\(cwnd\)代表拥塞窗口,所以,发送方要保证:

\[LastByteSent - LastByteAcked \leq min(cwnd, rwnd) \]

当出现超时事件或冗余ACK时,发送方认为丢包发生了

而当:

  1. 超时或冗余ACK发生时,增加\(cwnd\)
  2. 正常ACK到达,减少\(cwnd\)

慢启动

\(cwnd\)直接代表了发送方的发送速率,在慢启动阶段,设置\(cwnd\)的初始值为\(1MSS\)(最大报文长度),然后每次接到正常ACK都将\(cwnd\)增加1MSS,这是一个指数级增长,因为发送速率变大也会导致接收速率变大

  1. 当发送速率到达\(ssthresh\)时,转移到拥塞避免模式
  2. 当检测到拥塞时,减少\(ssthresh=cwnd/2\),重启慢启动过程
  3. 检测到3个冗余ACK,执行快速重传,进入快速恢复状态

拥塞避免

这个阶段,每个RTT(往返时间)将\(cwnd\)增加1MSS

  1. 出现超时时,\(ssthresh=cwnd/2,cwnd=1MSS\)
  2. 出现3个冗余ACK,\(ssthresh=cwnd/2, cwnd=cwnd/2\),进入快速恢复状态

快速恢复

快速恢复阶段不是TCP必须要求实现的阶段,所以没学过

posted @ 2022-08-11 08:32  yudoge  阅读(47)  评论(0编辑  收藏  举报