网络总结
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的往返时间为:
流量控制#
用于在接收方接收速率低于发送方发送速率时遏制发送方的速率
在接收方ACK的头部的字段中,显示了它可用的缓存窗口还有多大:
而发送方要保证:
当发送方发现接收方的时,它必须发送一个1字节的提醒报文,来通知接收方赶紧清空缓存,然后重新发送一个ACK报文段
拥塞控制#
概述#
由于网络层没提供任何支持,TCP只能根据一些拥塞发生时可能出现的现象,如丢包、超时、分组时延来作为判断拥塞的依据
就像代表接收端窗口,代表拥塞窗口,所以,发送方要保证:
当出现超时事件或冗余ACK时,发送方认为丢包发生了
而当:
- 超时或冗余ACK发生时,增加
- 正常ACK到达,减少
慢启动#
直接代表了发送方的发送速率,在慢启动阶段,设置的初始值为(最大报文长度),然后每次接到正常ACK都将增加1MSS,这是一个指数级增长,因为发送速率变大也会导致接收速率变大
- 当发送速率到达时,转移到拥塞避免模式
- 当检测到拥塞时,减少,重启慢启动过程
- 检测到3个冗余ACK,执行快速重传,进入快速恢复状态
拥塞避免#
这个阶段,每个RTT(往返时间)将增加1MSS
- 出现超时时,
- 出现3个冗余ACK,,进入快速恢复状态
快速恢复#
快速恢复阶段不是TCP必须要求实现的阶段,所以没学过
作者:Yudoge
出处:https://www.cnblogs.com/lilpig/p/16574619.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
欢迎按协议规定转载,方便的话,发个站内信给我嗷~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)