09-----TCP&UDP基础

141 阅读9分钟

TCP

TCP三次握手

基本原理

任何基于TCP的应用,发送数据前都需要先建立连接。TCP三次握手是指建立TCP连接时,客户端和服务端之间需要进行三次通信确认的过程。这个过程主要用来确保客户端和服务端能够互相理解和识别,从而成功建立连接,开始数据传输。

以下是TCP三次握手的详细步骤:

  1. 第一次握手:客户端发送一个SYN报文(SYN=1,ACK=0)给服务端,请求建立连接,并将其随机生成的初始序列号(Sequence Number)放入报文头部。

  2. 第二次握手:服务端收到客户端的SYN报文后,回复一个SYN+ACK报文(SYN=1,ACK=1),表示接受连接请求,并将自己的初始序列号放入报文头部。这里 +1,虽然并没有实际数据传输,我们只要把它当成有 1字节 数据。

  3. 第三次握手:客户端收到服务端的SYN+ACK报文后,再次发送一个确认报文ACK(ACK=1),表示客户端已经准备好传输数据。此时,客户端和服务端都认为连接已经建立,可以开始数据传输了。

以上就是TCP三次握手的基本流程。通过三次握手,TCP协议可以确保客户端和服务端之间建立了可靠的连接,并且双方都知道对方的序列号,确保数据包按照正确的顺序被传递。同时,如果其中有一个握手失败,则连接不会建立,这也保证了数据传输的安全性和可靠性。

数据包结构

Pasted image 20230519112034.png

抓包分析

  • 第一次握手

Pasted image 20230519111146.png

  • 第二次握手

Pasted image 20230519111225.png

  • 第三次握手

Pasted image 20230519111304.png

确认和重传

基本原理

TCP协议中的确认和重传机制可以保证数据在传输过程中不会丢失,从而确保了数据传输的可靠性。

  1. 确认机制

TCP协议使用确认机制来确定是否已成功接收到数据包。当一个设备接收到另一端发送的数据包时,会向对方回复一个ACK确认报文(ACK=1),表示已经正确接收到该数据包。如果发送方没有收到确认,那么就会持续发送数据包,直到接收到确认或达到最大重传次数。 注意:确认是再三次握手后每次都会有的机制。

当接收方收到多个连续的数据包时,可以使用累计确认机制来进行确认,即一次性确认收到所有数据包。

具体而言,如果接收方已经成功收到了序号为1、2、3、4的四个数据包,并准备好接收序号为5的数据包,那么确认报文中的确认号就是5,表示接收方已经成功接收到了序号小于等于4的数据包。这样发送方就知道哪些数据包已经被正确地接收到了,可以进行相应的重传或者调整窗口大小等操作。

需要注意的是,累计确认机制可以提高网络传输效率,但是也会存在一些问题。例如,如果某个数据包丢失或者损坏无法使用,那么接收方仍然会给出一个累计确认号,从而导致发送方不知道哪些数据包没有被正确接收到。此时,发送方需要使用超时重传机制来重新发送数据包,以确保数据传输的可靠性。

Pasted image 20230519114742.png

  1. 重传机制

TCP协议中的重传机制用于处理丢失数据包或损坏的数据包。如果一个设备没有收到对方发送的数据包,或者接收到的数据包损坏无法使用,则会向对方发送一个重传请求。接收到重传请求的设备将重新发送丢失或损坏的数据包。通常情况下,TCP协议会多次进行重传,以确保数据能够被成功传输。

Pasted image 20230519114906.png

抓包分析

  • 确认

Pasted image 20230519113812.png

  • 重传

Pasted image 20230519113907.png

窗口滑动机制

基本原理

TCP窗口滑动(Sliding Window)是一种流量控制机制,用于调整发送方和接收方之间数据传输的速率。在TCP协议中,窗口滑动机制允许发送方在得到确认前发送多个数据包,从而提高了网络的利用率和效率。

具体而言,TCP窗口滑动机制工作原理如下:

  1. 发送方首先会确定一个窗口大小,表示可以连续发送的未确认数据包数量。

  2. 发送方发送这些数据包,并等待接收方回复确认报文。

  3. 如果发送方收到了确认报文,则窗口向前滑动,发送方可以继续发送新的数据包。

  4. 如果没有收到确认报文,则发送方会重新发送窗口内的所有数据包,直到接收到确认为止。

  5. 接收方收到数据包后,会检查是否按正确顺序接收到了所有数据包,并且将确认号发送给发送方。

  6. 发送方收到确认后,根据确认号调整窗口大小,继续发送新的数据包。

需要注意的是,窗口大小会根据当前的网络情况动态调整。如果网络拥塞或带宽受限时,窗口大小会相应减小;如果网络畅通,则窗口大小会增大。通过窗口滑动机制,TCP协议可以自适应地调整数据传输速率,从而实现高效可靠的网络传输。

总之,TCP窗口滑动是TCP协议中的一种流量控制机制,可以在数据传输过程中自适应地调整发送和接收的速率,以确保网络传输的可靠性和效率。

Pasted image 20230519114946.png

窗口滑动机制与累计确认

在TCP协议中,接收方会为每一个已成功接收并处理的数据包发送一个ACK确认报文,确认号指的是接收方期望下一个数据包的序列号。而在窗口滑动机制中,发送方和接收方都有一个滑动窗口,表示可以传输的未确认数据包数量和可以接受的未确认数据包数量。发送方会根据接收方的窗口大小和当前网络情况来控制发送速率,而接收方则会根据已成功接收的数据包来调整自己的窗口大小。

当接收方收到多个连续的数据包时,可以使用累计确认机制进行确认。在确认报文中,确认号表示接收方期望下一次收到的数据包序号,即窗口大小加上已经成功接收的最后一个数据包的序号。发送方会根据这个确认号来确定是否需要重传某些数据包或者进行其他操作。

因此,可以说TCP的累计确认机制是基于窗口滑动机制实现的。窗口滑动机制提供了一个数据流量控制的框架,通过滑动窗口的大小和位置来控制数据传输的速率和顺序,而累计确认机制通过对多个连续的数据包进行一次性确认,实现了高效的网络传输。

TCP四次挥手

基本原理

TCP四次挥手是指关闭一个TCP连接时,客户端和服务端之间需要进行的四次通信过程。具体而言,TCP四次挥手的步骤如下:

  1. 第一次挥手:客户端发送一个FIN(Finish)报文给服务端,表示客户端已经没有数据要发送了,但仍然可以接收来自服务端的数据。

  2. 第二次挥手:服务端收到客户端的FIN报文后,回复一个ACK(Acknowledgement)报文,表示已经成功接收到客户端发送的FIN报文,并进入了CLOSE_WAIT状态。

  3. 第三次挥手:当服务端也没有数据要发送时,它会发送一个FIN报文给客户端,表示已经准备好关闭连接。

  4. 第四次挥手:客户端收到服务端的FIN报文后,回复一个ACK报文,表示已经成功接收到服务端发送的FIN报文,同时进入TIME_WAIT状态,等待一定时间后进入CLOSED状态。

第一次回收是已经完成数据传输的一方发起的,也就是说接收方并不一定完成了数据传输,所以第二次挥手只是确认,进入到wait状态,如果检测到确实也完成了数据传输,那么就会进行第三次挥手,发送FIN报文。

需要注意的是,在第四次挥手后,客户端和服务端都处于CLOSED状态,TCP连接才算真正关闭。此时,双方建立的连接就被完全终止了,对于两个方向的数据的传输就彻底结束了。

抓包分析

Pasted image 20230519121603.png

UDP

基本原理

UDP (User Datagram Protocol) 是一种无连接、不可靠的传输层协议,它与 TCP 协议一起构成了传输层的两个主要协议。下面是 UDP 的一些特点和应用场景:

  • 无连接:UDP 不像 TCP 那样需要在发送数据前建立连接,也不需要维护连接状态,因此在网络上的开销更小,适合短消息的传输。
  • 不可靠:UDP 不提供任何保障措施以确保数据的传输和接收,如确认、重传等机制,因此数据包有可能丢失或者无法正确到达目标主机。
  • 简单:UDP 的头部只有 8 字节,相较于 TCP 更加轻量级。

使用场景

由于 UDP 建立连接所需时间更少,可以实现比 TCP 更高的吞吐量,适用于以下场景:

  • 视频/音频流媒体:对于实时传输的视频或音频数据而言,即使出现少量的数据丢失,也不会对最终的效果产生太大影响,因此采用 UDP 能够在保持低延迟的同时实现高效的数据传输。
  • 游戏开发:大多数游戏都需要进行实时通信,包括玩家之间的语音、文字聊天、动作同步等,这些应用需要快速响应和低延迟,所以采用 UDP 是比较常见的一种方式。
  • DNS 查询:在进行 DNS 解析的时候,客户端向 DNS 服务器发送的请求通常都是短暂的并且需要快速响应,UDP 能够满足这个需求。