教你如何快速理解TCP与UDP协议

1、TCP(传输控制协议)

1.1端口

  • 传输层:为相互通信的应用程序提供逻辑通信,负责将数据从一端发送至另外一端
  • 在UDP/IP协议中,用源IP地址 + 源端口号 + 目的IP地址 + 目的端口号 + 协议号(组成的套接字),这样的五元组来标识一个通信
  • 端口号是一个32位的整数
  • 端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理
  • 端口范围的划分:
    1、0 - 1023: 知名端口号
    2、1024 - 65535: 操作系统动态分配的端口号
  • 常见知名端口号
    在这里插入图片描述

1.2 报文结构

在这里插入图片描述
源/目端口号:应用进程与应用进程之间通信的监听出入口。
序列号:序列号随机生成,每次序号都会不一样,有一个复杂的初始化算法。序列号会随着双方通讯而不断的增加。序列号一共32比特,最大值2^32-1,到达最大值后重新从0开始。
确认序列号:确认序列号是上次已成功接收到数据字节序列号加1。
首部长度:选项不用,TCP的头部为20字节;存在选项则为60字节。
保留:为将来定义新的用途保留,现在一般置0。
标志:每个标志占1比特,1表示有效,0为无效。

  1. URG:紧急指针是否有效。有效会告诉系统此时有紧急数据需要尽快传送。
  2. ACK:确认序号是否有效。仅当ACK=1时确认字段才有效。建立连接后,所有的传送的报文都必须把ACK置为1。
  3. PSH:接收方应该尽快将这个报文段交给应用层。不必等待缓存区满后再向上交付
  4. RST:复位,对方要求重新建立连接。当RST=1代表TCP连接出现严重差错,必须释放连接再重新建立连接。
  5. SYN:同步序列号,请求建立连接。在连接请求中,SYN=1 ACK=0表示该数据段是未捎带确认的连接请求报文;SYN=1 ACK=1表示是一个捎带了确认的连接请求报文。
  6. FIN:用于释放连接,FIN=1时表示发送方已经没有数据发送了,即关闭本方数据流。

窗口:滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小最大为65535。
检验和:覆盖了整个TCP报文段:TCP首部和TCP数据,因为TCP是一个可靠的协议,所以这是强制性的字段,由发送方计算和设置,并由接收方进行验证,这就是可靠性保证的重要手段。
紧急指针:只有当URG=1才有效。紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个报文段。TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。
选项:就是TCP头部的不是“必须”的选项
数据:可选,在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。

1.3 TCP的建立和终止

1.3.1 建立


描述:

  1. 客户端发送一个SYN报文表示希望和服务器建立连接,并附带上一个客户端随机产生的序列号X。,此时进入SYN-SEND状态。(同步发送)
  2. 服务端收到SYN请求后会发送给客户端SYN报文段作为应答。同时发送ACK报文段进行确认。并附带一个服务端随机产生的序列号Y和一个确认序列号X+1,此时为SYN-RCVD(同步收到)状态
  3. 客户端收到服务端发送的响应包后,客户端发送确认包给服务端表示收到了服务端发送的SYN报文。确认包中包含序列号X+1和确认序列号Y+1,此时双方进入了ESTAB-LISHED(建立连接)状态。

当以上三个报文段完成交互后就证明连接已经建立,这个过程也成为“三次握手”。接下来客户端就可以发送数据给服务端,服务端可以响应数据。

经典面试题:为何TCP客户端最后还要发送一次确认呢?
主要防止已经失效的数据报文突然又传送到服务器,从而产生错误

1.3.2 终止

在这里插入图片描述
描述:

  1. 客户端发送FIN报文希望主动关闭连接,报文中携带随机序列号U。此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
  2. 服务端收到这个FIN报文段时,它将发送给客户端一个ACK表示确认断开,此报文中携带随机序列号V和一个确认序列号U+1。此时,服务端就进入了CLOSE_WAIT(关闭等待)状态。
  3. 服务端把收到的FIN的消息告诉应用程序,应用程序就会关闭它的连接。导致服务端发送一个FIN给客户端。报文中携带确认序列号U+1。由于半连接状态,服务端很可能又发送了一些数据。 此时,服务器就进LAST-ACK(最后确认)状态,等待客户端的确认。
  4. 客户端收到服务端的FIN报文段时,此时,客户端就进入FIN-WAIT-2(终止等待2)状态。客户端会立刻对此FIN报文进行ACK回复,报文中包含序列号U+1和确认序列号V+1。此时TCP连接还没有释放,必须经过2MSL(最长长报文段生存)的时间后,才进入CLOSED状态。

:TCP是全双工模式的,客户端关闭连接不代表服务端就可以立刻关闭,如果客户端发起关闭的时候,服务端还没有响应完数据给客户端,服务端还是需要把数据发完了再去关闭的,而客户端主动发起了闭关但不会立即关闭,而是进入“FIN_WAIT2”状态进行数据接收,此为半关闭。直到服务端发送完了并最后发送结束连接报文段FIN才进入TIME_WAIT状态。

1.3.3 为何需要三次握手,四次断开?

  • 建立一个连接需要三次握手,而终止一个连接需要经过4次握手,这是由于TCP的半关闭造成的。既然一个TCP连接是全双工的(即数据在两个方向上能同时传递),因此每个方向必须单独地进行关闭。当一端收到一个FIN,它必须通知应用层另一端已经终止了那个方向的数据传送。发送FIN通常是应用层关闭的结果,一般为客户端关闭连接。

1.3.4 MSL与2MSL等待时间

  • TCP报文的在网络上单向传送的最大生存时间叫做MSL

  • 2MSL(最大报文段生存时间)等待状态。之所以要等待,是因为关闭方要确认处于“CLOSE_WAIT”状态的被关闭方收到它最后的ACK报文,,等待确认报文来回的时间就是2MSL,如果被关闭方在2MSL内都没有收到ACK,就会重复发送FIN报文。如果关闭方在2MSL时间内未收到被关闭方的报文,则默认收到
    Windows : MSL = 2 min
    linux(Ubuntu, CentOs) : MSL = 60s

  • 2MLS等待原因
    1、2MSL的时间能保证在两个传输方向上的未被接收的数据和迟到的数据全部被丢弃(当连接关闭时,有可能收到迟到的报文段。这时,若立马就建立新的连接(同一端口),那么新的连接就会接收迟到的报文,误以为是发给自己的)
    2、保证了最后一个报文可靠到达(假设最后一个ACK丢失, 那么服务器会再重发一个FIN. 这时虽然客户端的进程不在了,但是TCP连接还在,仍然可以重发LAST_ACK)如果直到2MSL,客户端都没有再次收到FIN,那么客户端推断ACK已经被成功接收,则结束TCP连接。

注:报文在网络中的生存时间并不只由TCP决定的,网络层的IP协议对数据报同样存在着网络单向传送的时间限制,这个限制叫TTL。

1.3.5 同时打开和关闭

TCP建立连接不一定必须是三次握手,有时可能会是4次。

  • 比如当双发同时进行请求主动打开连接的时候就是4次。此时并没有客户端和服务端之称,双方都有主动发送数据的权利。

在这里插入图片描述

1.4 可靠传输机制

确认应答机制和重传机制

  • 当数据完整发送到对端时,对端会发送确认序列号(ACK)确保数据完整性,当数据中的某些数据段因为一些原因未能传输到对端时(丢包),就会采用重传机制对丢失的数据段进行重发。从而保证了数据的可靠性

如何确定超时重传时间?

  • 系统基于TCP协议实现,动态计算报文最大生存时间(MSL),超时时间设置为2MSL。
  • 超过超时时间表示丢包,需要重新发数据。数据不会被反复,无限重发,达到一定次数强制关闭连接。

1.5 滑动窗口

  • 滑动窗口
    用来告诉发送端可以发送数据的大小或者说是窗口标记了接收端缓冲区的大小。窗口指一次批量发送多少数据

  • 滑动窗口产生的原因
    在确认应答的策略中,每发送一次数据段都需要一个ACK确认应答,收到ACK后再发送下一个数据段,这样每次都需要确认,性能较差。采用滑动窗口的机制就会一次发送多条数据,提高传输性能

  • 丢包后如何重传
    1、数据包并未丢失,ACK确认包丢失
    当窗口值较大时,即使有少量的确认应答丢失,也不会进行重传,可以通过下一个确认应答进行确认
    2、数据包直接丢失
    接收端在没有收到自己所期望序号的数据时,会对之前收到的数据进行确认应答。发送端一但收到某个确认应答后,又连续3次收到同样的确认应答,则认为数据段已经丢失,需要进行重发。这种机制比起超时机制可以提供更为快速的重发服务,也叫快重传。

1.6 流量控制

  • 接收端通过TCP协议头中”窗口大小“字段,告知发送端发送数据的大小。
  • 流量控制的目的:防止接收缓冲区被占满,再次接收到的数据就会被直接丢弃,接收端主机无法处理。
  • 接收端将自己可以接收的缓冲区大小放入 TCP 首部中的 “窗口大小” 字段, 通过ACK端通知发送端
  • 窗口大小字段越大, 说明网络的吞吐量越高
  • 接收端一旦发现自己的缓冲区快满了, 就会将窗口大小设置成一个更小的值通知给发送端
  • 发送端接受到这个窗口之后, 就会减慢自己的发送速度
  • 如果接收端缓冲区满了, 就会将窗口置为0; 这时发送方不再发送数据, 但是需要定期发送一个窗口探测数据段, 使接收端把窗口大小告诉发送端

1.7 拥塞控制

  • 如果在刚开始阶段发送大量的数据, 会引发大量问题

  • 拥塞控制就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载

    1.7.1 慢启动与拥塞避免

  • 慢启动的思路就是,不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小。
    在这里插入图片描述

  • TCP开始启动的时候, 慢启动阈值等于窗口最大值

  • 拥塞避免是指把拥塞窗口设置为线性规律增长,使网络较不容易出现拥塞

  • 每次超时重发的时候, 慢启动阈值会变成原来的一半, 同时拥塞窗口置回1

  • 少量的丢包, 仅仅触发超时重传; 大量的丢包, 我们就认为网络拥塞

  • 当TCP通信开始, 网络吞吐量会逐渐上升; 随着网络发生拥堵, 吞吐量会立刻下降

  • 拥塞控制, 归根结底是TCP协议想尽可能快的把数据传输给对方, 但是又要避免给网络造成太大压力的一种方案

1.7.2 快重传和快恢复

  • 快重传要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方)而不要等到自己发送数据时捎带确认。快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。
  • 当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把慢启动阈值门限减半。但是接下去并不执行慢开始算法。
  • 考虑到如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞。所以此时不执行慢开始算法,而是将拥塞窗口设置为慢启动阈值的大小,然后执行拥塞避免算法

2、UDP(用户数据报协议)

2.1 报文结构

在这里插入图片描述
源端口号:源主机的应用程序使用的端口号。
目的端口号:目的主机的应用程序使用的端口号。
UDP长度:是指UDP头部和UDP数据的字节长度。因为UDP头部长度为8字节,所以该字段的最小值为8。
**UDP校验和:**该字段提供了与TCP校验字段同样的功能;该字段是可选的。

2.2 UDP特点

  • 无连接:知道对端的IP和端口号就直接进行传输,不需要建立连接
  • 不可靠:没有确认机制,没有重传机制;如果因为网络故障该段报文无法送达对方,UDP协议也不会给应用层返回任何错误信息
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章