0%

TCP&UDP简要整理

简要记录一下TCP/IP模型、TCP的三次握手与四次挥手、TCP&UDP的比较。

TCP/IP模型

TCP/IP模型是互联网的基础,包括了一系列网络协议,例如TCP、UDP、IP、FTP、HTTP等,这些协议可以分为四层、由上至下分别为应用层、传输层、网络层、链路层。

TCP/IP模型&OSI七层模型

TCP的三次握手与四次挥手

建立连接——三次握手

  • 第一次握手:客户端向服务端发送建立连接请求报文连接SYN(序号Seq=x)
  • 第二次握手:服务端返回连接SYN确认ACK(序号Seq=y、确认号Ack=x+1)
  • 第三次握手:客户端发送确认ACK(确认号Ack=y+1)

若在一定时间内没有接收到确认应答,发送端会认为数据已经丢失,并进行重发;但实际上,发送端没有接收到确认应答,不一定是数据丢失,也可能是返回的确认应答在途中丢失,也会导致发送端重发;此外,也可能是确认应答延迟到达,发送端重发数据后才接收到。数据被重发后,若还接收不到确认应答,则再次发送。这时,等待确认应答的时间将会以2倍、4倍的指数函数增长;但数据也不会无限重发,达到一定的重发次数后,还没接收到确认应答,就会认为网络或对端主机发送异常,强制关闭连接,并通知应用通信异常,强行终止

每一次传输数据时,TCP都会标记段的序列号,以便对方确认。在TCP中并不直接确认接收到哪些段,而是通知发送端下一次应该发送哪一个段,表示前面的段已经接收到;比如:接收到的确认应答为N+1时,表示N以及N之前的数据都已接收完毕。

在TCP进行通信前,发送一个SYN包作为建立连接的请求;在通信结束时,会使用FIN包进行断开连接的处理。SYN包和FIN包是通过TCP头部的控制字段来管理TCP连接。创建一个TCP连接,会产生一个32位随机序列号。TCP的三次握手至少需要发送3个包,四次挥手至少需要发送4个包。

三次握手的关键是确认对方接收到自己发送的数据包,计算机会记录该数据包的序号Seq,当收到对方返回的数据包后,检测数据包的确认号Ack,若Ack=Seq+1,则表示对方正确接收到自己发送的数据包。

经过传输层协议封装后的数据称为。在建立TCP连接时,可以确定数据段的大小,即最大消息长度(MSS)。TCP在传输大量数据时,是以MSS的大小将数据进行分割发送;数据的重发也是以MSS为单位。MSS是在三次握手时,由两端主机计算而来;两端主机在发出建立连接的请求时,会在TCP头部写入MSS值,然后在两者之间选择较小的值使用,MSS默认值为536字节理想值为1460字节

断开连接——四次挥手

  • 第一次挥手:客户端向服务端发送断开连接请求报文断开FIN(序号Seq=x)
  • 第二次挥手:服务端返回确认ACK(序号Seq=y、确认号Ack=x+1)
  • 第三次挥手:服务端发送表示可以断开连接的报文断开FIN(序号Seq=y+1、确认号:Ack=x+1)
  • 第四次挥手:客户端返回确认ACK(序号Seq=x+1、确认号Ack=y+2)

TCP&UDP的比较

UDP

UDP,全称User Datagram Protocol。UDP不提供复杂的控制机制,利用IP提供面向无连接的、不可靠的通信服务。并且,UDP是将应用程序发来的数据,在收到的那一刻,立即按照原样发送到网络上的一种机制。即使在网络出现拥堵的情况下,UDP也无法进行流量控制。传输过程中出现丢包,UDP也不负责重发。当出现包的到达顺序错误时也没有纠正的功能。如果需要这些细节控制,那么需要交由上层的应用程序去处理

UDP的特点

  • UDP是无连接的:UDP发送数据前不与对方建立连接;
  • UDP不对数据进行排序:UDP报文的头部没有数据顺序的信息;
  • UDP对数据不发送确认,发送端不知道数据是否被正确接收,也不会重发数据;
  • UDP传送数据比TCP快,系统开销少;
  • UDP缺乏拥塞控制机制,不能检测到网络拥塞。

UDP的应用

  • 包总量较少的通信(DNS、SNMP、TFTP等)
  • 视频、音频等多媒体通信(即时通信)
  • 只在局域网内使用的应用通信
  • 广播通信(广播、多播)

UDP格式

UDP段由UDP头部和UDP数据组成。UDP头部由源端口号目的端口号长度校验和组成,UDP头部长度为固定的8字节。

  • 源端口号:字段长16位,表示发送端UDP端口号。
  • 目的端口号:字段长16位,表示接收端UDP端口号。
  • 长度:字段长16位,表示UDP头部和UDP数据的总长度。
  • 校验和:字段长16位,由UDP头部和UDP数据的内容计算得出,用于检查在传输过程中是否出现错误。

TCP

TCP是一种面向连接的协议,在数据传输前必须在发送方和接收方之间建立连接,还通过校验和序列号确认应答重发控制连接管理以及窗口控制等机制实现可靠性传输;只支持点对点的单播传输方式,提供全双工通信,在不保留报文边界的情况下以字节流的方式进行数据传输;适用于对传输可靠性要求高的应用(例如文件传输)。

TCP的特点

  • 三次握手建立连接:确保连接建立的可靠性;
  • 端口号:通过端口号识别上层协议和服务,实现网络的多路复用;
  • 完整性校验:通过计算校验和,保证接收端能检测出传输过程中可能出现的错误;
  • 确认机制:对于正确接收到的数据,接收端通过确认应答告知发送端,超出一定时间后,发送端将重传没有被确认的段,确保传输的可靠性;
  • 序列号:发送的数据都有唯一的序列号,标识了每一个段,接收端可以通过序列号实现丢失检测、乱序重排等功能;
  • 窗口机制:通过可调节的窗口,接收端可以告知希望的发送速度,控制数据流量。

TCP格式

TCP头部由一个20字节的固定长度加上可变长的选项字段组成。

  • 源端口号:字段长16位,表示发送端TCP端口号。

  • 目的端口号:字段长16位,表示接收端TCP端口号。

  • 序列号:字段长32位,是指TCP段数据的位置序号,根据序列号来判断是否存在重收、漏收、乱序等情况。

  • 确认号:字段长32位,是指下一次应该收到的数据的序列号,收到这个确认号,表示这个确认号之前的数据都已经正常收到。

  • 数据偏移:字段长4位,表示TCP数据从哪一位开始计算,也可看作TCP头部的长度。

  • 保留:字段长6位,保留给以后扩展使用。

  • 控制位:字段长6位,每1位标志位可以打开一个控制功能;

    • URG:标志位为1时,表示有需要紧急处理的数据;
    • ACK:标志位为1时,表示确认应答有效;
    • PSH:标志位为1时,表示将数据立即上传给应用程序,而不是在缓冲区排队;
    • RST:标志位为1时,表示TCP连接出现异常,必须强制断开连接;
    • SYN:标志位为1时,表示请求建立连接,并设置序列号的初始值;
    • FIN:标志位为1时,表示数据发送结束,请求断开TCP连接。
  • 窗口:字段长16位,表示滑动窗口的大小。

  • 校验和:字段长16位,由TCP头部和TCP数据的内容计算得出,用于检查在传输过程中是否出现错误。

  • 紧急指针:字段长16位,表示紧急数据的长度;当URG位为1时,该字段才生效。

  • 选项:字段的长度是可变的;通过添加不同的选项来实现TCP的一些扩展功能。

  • 填充:如果TCP段的头部长度不是4字节的整数倍,就填充若干0,来保证头部长度是4字节的整数倍。

  • 数据:TCP段的数据部分,字段最大是MSS。

补充

窗口控制

TCP是以1个段为单位,每发送一个段进行一次确认应答,如果包的往返时间越长,通信性能就越低。所以,TCP引入了窗口的概念,确认应答不再是每个分段,而是以窗口的大小来进行确认,窗口大小即指无需等待确认应答,而可以继续发送数据的最大值。因为窗口大小是一个16位字段,因此窗口最大为65535字节。在TCP传输过程中,双方通过交换窗口的大小来表示自己剩余的缓冲区(Buffer)空间,以及下一次能接受的最大数据量,避免缓冲区的溢出。

在发送数据的过程中,窗口内的数据即使没有收到确认应答也可以发送出去。若窗口中的数据在传输过程中丢失,也需要进行重发。因此,发送端在收到确认应答前,必须保留缓冲区中的该部分数据。

接收到确认应答后,将窗口滑动到确认应答中的序列号位置。这样可以按顺序将多个段同时发送,该机制也被称为滑动窗口控制

重发机制

在使用窗口控制时,若确认应答未能返回,但数据已被接收,这种情况下是不需要进行重发的(即使某些确认应答丢失)。

若某个报文段丢失,接收方收到序号不连续的数据时,会为已接收到的数据返回确认应答,且将已接收到的数据暂时保存至缓冲区。出现报文丢失时,同一序号的确认应答将会被重复发送。若发送方收到连续3次同一序号的确认应答,就会将对应的数据进行重发,该机制被称为高速重发机制

流控制

流控制是一种可以让发送方根据接收方的实际接收能力控制发送的数据量的机制。接收方通知发送方自己可以接收数据的大小,发送方就会发送不超过该限度的数据量,该限度为窗口大小。

TCP头部中有一个字段用来通知窗口大小,当接收方的缓存区空间不足或处理能力有限时,窗口大小的值就会降低一半,从而控制数据发送量。

若接收方要求的窗口大小为0,则表示接收方已经接收全部数据,或接收方要求暂停发送

发送方会时不时地发送一个被称为窗口探测的数据段,该数据段仅包含一个字节以获取最新的窗口大小。

拥塞控制

在网络出现拥堵时,如果突然发送一个较大量的数据,有可能导致整个网络瘫痪。为防止该问题出现,在通信开始时,会通过一个被称为慢启动的算法得出的数值,对发送数据量进行控制。

为了在发送方调节发送数据的量,需要使用拥塞窗口。在慢启动时,将拥塞窗口的大小设置为1MSS,之后每收到一次确认应答,拥塞窗口的值就加1。在发送数据时,将拥塞窗口的大小接收方通知的窗口大小作比较,选择其中的较小值来发送数据,这样可以避免网络拥塞的发生。


参考资料:

一文搞懂TCP与UDP的区别

我终于搞懂了TCP的三次握手和四次挥手(图片案例超详解)

TCP的三次握手与四次挥手理解及面试题(很全面)

传输控制协议- 维基百科,自由的百科全书

33 张图详解 TCP 和 UDP :打通网络和应用的中间人