复习TCP、UDP协议(三次握手、四次挥手)

复习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头部格式:

复习TCP、UDP协议(三次握手、四次挥手)

20个字节固定首部:
源端口(2B)、目标端口(2B)、序号(服务器端字节流发送的第一个字节序号)、
确认号(客户端返回让服务器端发送字节流的第一个字节的序号)、
数据偏移(记录TCP数据部分的起始地址)4b 一位代表4个字节、保留(目前没用)、
标记位:
URG:当前数据包发送的优先级
ACK:确定确认号是否有效
SYN:会话同步
PSH:当前数据包就收的优先级
RST:TCP会话异常错误
FIN:释放连接
可变长度(非必须)
了解一下UDP头部格式:
复习TCP、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状态进行通信
      复习TCP、UDP协议(三次握手、四次挥手)
      用单身狗的方式了解下:
      复习TCP、UDP协议(三次握手、四次挥手)
      为什么需要三次握手?二次、四次不行吗?
      原因一:三次握手可以避免资源浪费
      如果只有两次握手,当客户端的请求连接在网络中阻塞,客户端没有接收到报文,就会重新发送,由于没有第三次握手,服务器不清楚客户端是否收到了自己发送的建立连接的确认信号,所以每收到一个就只能先主动建立一个连接,占用一个端口,浪费服务器资源
      比如:客户端A给服务器B发送一个建立连接的请求,但是网络传输比较慢,一段时间A发现B没有回应,于是又给B发送一次请求,这次网络比较顺畅先于第一次请求到达B,B给第二次一个回应,A收到回应连接建立。但是过一会第一次连接也到了B,B又给一次回应,这次A不搭理他。B就一直在等A的回应。占用系统资源系统资源
      原因二:三次握手可以避免历史连接导致连接混乱问题
      客户端A给服务器B发送一个请求,由于某种原因B没收到,于是A又重新发送一次,然后B收到两个请求,造成连接混乱

2、数据传输阶段

2.1 流量控制:

先了解一下TCP协议进行数据传输的过程
复习TCP、UDP协议(三次握手、四次挥手)

  • 先将文件分块放入发送方的TCP缓存中
  • 后由网络从缓存中取出数据传输
  • 接收方接收数据放入缓存
  • 再从缓存中取出数据
    tips:面向字节流:将文件分块(大小不一定)放入TCP缓存中再从缓存中将数据进行传输,传输大小与放入缓存中块的大小不同。以某几个字节为一组进行传输(随机)
    流量控制的方法是使用滑动窗口技术:
    在发送方和接收方缓存中设置一个相同大小的滑动窗口,根据数据传输中约定滑动窗口的大小实现流量控制
    复习TCP、UDP协议(三次握手、四次挥手)

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状态
    复习TCP、UDP协议(三次握手、四次挥手)
    单身狗的理解方式:

复习TCP、UDP协议(三次握手、四次挥手)
为什么握手需要三次挥手需要四次:

​ 简而言之,建立连接时服务端同意建立连接时也已经做好准备,两步可以合为一步。而断开连接时需要先同意,然后处理遗留的数据,之后再返回确认

为什么客户端在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