复习TCP、UDP协议(三次握手、四次挥手)
复习TCP、UDP协议(包含三次握手、四次挥手)
一、首先了解一下TCP、UDP协议
可以看出TCP、UDP协议是工作在传输层的协议
那么什么是TCP协议呢?
TCP协议:
- 文件分段
- 建立会话
- 可靠传输
- 流量控制
- 拥塞控制
- 提供全双工通信
- 面向字节流传输
- 点对点通信
简单来说就是:可靠的传输层协议
那么什么又是UDP协议呢?
UDP协议:
- 一个数据包即可完成通信
- 无需无需建立会话
- 无需流量控制
- 无需可靠传输
- UDP尽最大努力交付,但是不保证可靠交付
- 支持一对一、一对多、多对多通信
让我们比较一下TCP和UDP的区别吧
TCP与UDP区别:
1、连接
- TCP是面向连接的传输层协议,传输数据需要先建立连接
- UDP不需要连接,即刻传输数据
2、服务对象
- TCP是一对一的两点服务
- UDP支持一对一、一对多、多对多服务
3、可靠性
- TCP可靠的传输层协议
- UDP尽力传输数据,不保证数据可靠性
4、拥塞控制
- TCP具有拥塞控制机制
- UDP不具有拥塞控制
5、流量控制
- TCP具有流量控制机制
- UDP不具有流量控制
6、首部开销
- TCP协议首部较长,首部一般为20字节,如果加上可选则会增大
- UDP协议首部较短,8个字节固定不变开销较小
了解一下TCP头部格式:
20个字节固定首部:
源端口(2B)、目标端口(2B)、序号(服务器端字节流发送的第一个字节序号)、
确认号(客户端返回让服务器端发送字节流的第一个字节的序号)、
数据偏移(记录TCP数据部分的起始地址)4b 一位代表4个字节、保留(目前没用)、
标记位:
URG:当前数据包发送的优先级
ACK:确定确认号是否有效
SYN:会话同步
PSH:当前数据包就收的优先级
RST:TCP会话异常错误
FIN:释放连接
可变长度(非必须)
了解一下UDP头部格式:
二、详解TCP协议
1、建立连接阶段
1.1 三次握手:
了解一下步骤:
- 最初双方都处于closed状态
- 服务端进入监听状态listen
- 客户端发送:SYN=1,ACK=0,seq=x
- 进入syn_sent状态
- 服务端响应:SYN=1,ACK=1,seq=y,ack=x+1
- 进入syn_rcvd状态
- 客户端再次确认:ACK=1,seq=x+1,ack=y+1
- 双方进入established状态进行通信
用单身狗的方式了解下:
为什么需要三次握手?二次、四次不行吗?
原因一:三次握手可以避免资源浪费
如果只有两次握手,当客户端的请求连接在网络中阻塞,客户端没有接收到报文,就会重新发送,由于没有第三次握手,服务器不清楚客户端是否收到了自己发送的建立连接的确认信号,所以每收到一个就只能先主动建立一个连接,占用一个端口,浪费服务器资源
比如:客户端A给服务器B发送一个建立连接的请求,但是网络传输比较慢,一段时间A发现B没有回应,于是又给B发送一次请求,这次网络比较顺畅先于第一次请求到达B,B给第二次一个回应,A收到回应连接建立。但是过一会第一次连接也到了B,B又给一次回应,这次A不搭理他。B就一直在等A的回应。占用系统资源系统资源
原因二:三次握手可以避免历史连接导致连接混乱问题
客户端A给服务器B发送一个请求,由于某种原因B没收到,于是A又重新发送一次,然后B收到两个请求,造成连接混乱
- 双方进入established状态进行通信
2、数据传输阶段
2.1 流量控制:
先了解一下TCP协议进行数据传输的过程
- 先将文件分块放入发送方的TCP缓存中
- 后由网络从缓存中取出数据传输
- 接收方接收数据放入缓存
- 再从缓存中取出数据
tips:面向字节流:将文件分块(大小不一定)放入TCP缓存中再从缓存中将数据进行传输,传输大小与放入缓存中块的大小不同。以某几个字节为一组进行传输(随机)
流量控制的方法是使用滑动窗口技术:
在发送方和接收方缓存中设置一个相同大小的滑动窗口,根据数据传输中约定滑动窗口的大小实现流量控制
2.2 拥塞控制:
拥塞控制:(这里不做重点不过多赘述)
- 是一个全局性的过程,涉及到所有的主机、
- 所有的路由器以及与降低网络传输性能有关的所有因素
- 通过慢开始门限(出现拥塞的值/2)和拥塞避免算法
快重传:接收多个数据包才进行一个确认,发现丢包就连续发多个数据包让服务端重传
快恢复:丢包后就从新门限值开始进行拥塞控制
3、断开连接阶段
3.1 四次挥手:
TCP连接的释放,必须是一方主动释放,另一方被动释放。
步骤:
- 客户端主动关闭:发送FIN=1,seq=u
- 客户端进入FIN-WAIT状态
- 服务端被动关闭:ACK=1,seq=v,ack=u+1
- 服务端进入CLOSE-WAIT
- 服务端再次发送:FIN=1,ACK=1,seq=w,ack=u+1
- 服务端进入LAST-ACK
- 客户端接收后发送:ACK=1,seq=u+1,ack=w+1
- 客户端进入TIME-WAIT
- 服务端收到后进入CLOSE状态
- 客户端等待2MSL后进入CLOSE状态
单身狗的理解方式:
为什么握手需要三次挥手需要四次:
简而言之,建立连接时服务端同意建立连接时也已经做好准备,两步可以合为一步。而断开连接时需要先同意,然后处理遗留的数据,之后再返回确认
为什么客户端在TIME-WAIT阶段要等2MSL:
因为当客户端发出最后的ACK确认报文后,服务器并不会回应,所以客户端不确定服务端是否收到该报文段,所以设置一个等待时间。
MSL指:一个TCP报文在传输过程中的最大生命周期。
2MSL即是服务器端发出FIN报文和客户端发出ACK确认报文所能保持有效的最大时长
如果客户端在发出ACK确认报文后的2MSL内,又收到了服务器端的FIN报文,证明服务端没有收到客户端的ACK确认报文,于是客户端重新发送ACK确认报文,重新计时,如果2MSL内没有收到服务器的FIN报文,证明服务器已经收到报文并关闭,于是客户端也关闭
部分图片摘自:https://baijiahao.baidu.com/s?id=1654225744653405133&wfr=spider&for=pc