传输层 · UDP · TCP
提示:本系列文章已经修订完毕,修改了纰漏,优化了文章结构。为了获得更好的阅读体验,请查看以下新专栏或新站点
CSDN 新专栏:
https://blog.csdn.net/keeppromise/category_12489629.html
我的个人博客(Github Page):
https://blog.lens-shrine.top/categories/学习记录:网络协议/
网络互连模型
请求过程
网络分层
传输层(Transport)
UDP
数据格式:
UDP长度(Length)
占16位:首部的长度 + 数据的长度
检验和(Checksum)
端口
常用命令 【实践】
netstat –an
查看被占用的端口
netstat –anb
查看被占用的端口、占用端口的应用程序
telnet 主机 端口
查看是否可以访问主机的某个端口
TCP
TCP的几个要点:
- 可靠传输
- 流量控制
- 拥塞控制
- 连接管理(建立连接、释放连接)
数据格式:
首部
首部 - 序号
首部 - 确认号
首部 - 数据偏移
- 占4位,取值范围是 0x0101 ~ 0x1111(5~15)
- 数据偏移 * 4 = 首部长度(Header Length)
- 首部长度是 20 ~ 60 字节
首部 - 保留
- 占6位,目前全为0
小细节: 有些资料中,TCP首部的 保留(Reserved)字段 占3位,标志(Flags) 字段占9位(Wireshark中也是如此)
首部 - 标志位
标志位(Flags)
URG(Urgent)
- 当 URG = 1 时,紧急指针字段才有效。表明当前报文段中有紧急数据,应优先尽快传送
ACK(Acknowledgment)
- 当 ACK = 1 时,确认号字段才有效
PSH(Push)
RST(Reset)
- 当 RST = 1 时,表明连接中出现严重差错,必须释放连接,然后再重新建立连接
SYN(Synchronization)
- 当 SYN = 1、ACK = 0 时,表明这是一个建立连接的请求
- 若对方同意建立连接,则回复 SYN = 1、ACK = 1
FIN(Finish)
- 当 FIN = 1 时,表明数据已经发送完毕,要求释放连接
首部 - 窗口
首部 - 检验和
检验和(CheckSum)
跟UDP一样,TCP检验和的计算内容:伪首部 + 首部 + 数据。
伪首部:占用12字节,仅在计算检验和时起作用,并不会传递给网络层。
要点 - 可靠传输
可靠传输是为了保证包的完整性,当有丢包、受到三次重复确认等情况,就会重新发包。
停止等待ARQ协议
ARQ(Automatic Repeat–reQuest),自动重传请求。
疑问: 若有个包重传了N次还是失败,会一直持续重传到成功为止么?
- 这个取决于系统的设置,比如有些系统,重传5次还未成功就会发送 reset报文(RST)断开TCP连接。
连续ARQ协议 + 滑动窗口协议
如果接收窗口最多能接收4个包,但发送方只发了2个包,接收方如何确定后面还有没有2个包?
等待一定时间后没有第3个包,就会返回确认收到2个包给发送方。
SACK(选择性确定)
SACK(Selective acknowledgment,选择性确认)技术
- 告诉发送方哪些数据丢失,哪些数据已经提前收到
- 使TCP只重新发送丢失的包,不用发送后续所有的分组
可靠传输图示:
思考:
为什么选择在传输层就将数据“大卸八块”分成多个段,而不是等到网络层再分片传递给数据链路层?
要点 - 流量控制
流量控制 - 特殊情况
流量控制图示
要点 - 拥塞控制
方法
慢开始(slow start)
cwnd的初始值比较小,然后随着数据包被接收方确认(收到一个ACK),cwnd就成倍增长(指数级)
拥塞避免(congestion avoidance)
快重传
快恢复
快重传 + 快恢复
发送窗口的最大值
发送窗口的最大值swnd = min(cwnd, rwnd)
- 当 rwnd < cwnd 时,是接收方的接收能力限制发送窗口的最大值
- 当 cwnd < rwnd 时,则是网络的拥塞限制发送窗口的最大值
序号、确认号(详细)
序号,确认号——相对:
序号,确认号——原生:
要点 - 建立连接
三次握手
状态解读:
- CLOSED:client处于关闭状态
- LISTEN:server处于监听状态,等待client连接
- SYN-RCVD:表示server接受到了SYN报文,当收到client的ACK报文后,它会进入到 ESTABLISHED 状态
- SYN-SENT:表示client已发送SYN报文,等待server的第2次握手
- ESTABLISHED:表示连接已经建立
前2次握手的特点:
疑问
采用 “三次握手” 的办法可以防止上述现象发生
例如上述情况,client没有向 server的确认 发出确认,server由于收不到确认,就知道client并没有要求建立连接。
如果第3次握手失败了,会怎么处理?
- 此时server的状态为 SYN-RCVD,若等不到client的 ACK,server会重新发送 SYN+ACK 包
- 如果server多次重发 SYN+ACK 都等不到client的 ACK,就会发送 RST包,强制关闭连接
要点 - 释放连接
四次挥手
状态解读:
FIN-WAIT-1:表示想主动关闭连接
- 向对方发送了FIN报文,此时进入到FIN-WAIT-1状态
CLOSE-WAIT:表示在等待关闭
- 当对方发送FIN给自己,自己会回应一个ACK报文给对方,此时则进入到CLOSE-WAIT状态
- 在此状态下,需要考虑自己是否还有数据要发送给对方,如果没有,发送FIN报文给对方
FIN-WAIT-2:只要对方发送ACK确认后,主动方就会处于FIN-WAIT-2状态,然后等待对方发送FIN报文
CLOSING:一种比较罕见的例外状态
- 表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文
- 如果双方几乎在同时准备关闭连接的话,那么就出现了双方同时发送FIN报文的情况,也即会出现CLOSING状态
- 表示双方都正在关闭连接
LAST-ACK:被动关闭一方在发送FIN报文后,最后等待对方的ACK报文
- 当收到ACK报文后,即可进入CLOSED状态了
TIME-WAIT:表示收到了对方的FIN报文,并发送出了ACK报文,就等 2MSL 后即可进入CLOSED状态了
- 如果FIN-WAIT-1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME-WAIT状态,而无须经过FIN-WAIT-2状态
CLOSED:关闭状态
由于有些状态的时间比较短暂,所以很难用 netstat 命令看到,比如SYN-RCVD、FIN-WAIT-1等
疑问
细节
长连接、短链接
如果建立连接后不需要进行数据交互就会关闭,那就是短连接。
如果建立连接后需要进行数据交互以后再关闭,那就是长连接。
TCP完整流程
1.
2.