一文读懂——TCP&UDP原理
传输层定义了主机应用程序之间端到端的连通性。传输层中最为常见的两个协议分别是传输控制协议TCP(Transmission Control Protocol)和用户数据包协议UDP(User Datagram Protocal)。
一、TCP协议
TCP位于TCP/IP模型的传输层,它是一种面向连接的端到端协议,可以为主机提供可靠的数据传输。
1.TCP头部格式
主要字段:
源端口(Source Port):16位的源端口字段(16bit)包含初始化通信的端口号。源端口和源IP地址的作用是标识报文的返回地址。端口:2^16=65536,端口范围:0~65535
目的端口(Destination Port):16位的目的端口字段定义传输的目的。这个端口指明接收方计算机上的应用程序接口。
***(Sequence Number):该字段用来标识TCP源端设备向目的端设备发送的字节流,它表示在这个报文段中的第一个数据字节。如果将字节流看作在两个应用程序间的单向流动,则TCP用***对每个字节进行计数。***是一个32位的数。
确认号(Acknowledgement Number):TCP使用32位的确认号字段标识期望收到的下一个段的第一个字节,并声明此前的所有数据都已经正确无误地收到,因此,确认号应该是上次已成功收到的数据字节***加1.收到确认号的源计算机会知道特定的段已经被收到。确认号的字段只在ACK标志被设置时才有效。
保留(Reserved):6位置0的字段。为将来定义新的用途保留。
控制位(Control Bits):共6位,每1位标志可以打开一个控制功能,者六个标志从左至右是URG(Urgent Pointer field signficant 紧急指针字段标志)、ACK(Acknowledgement field significant 确认字段标识)、PSH(Push Function 推功能)、RST(Reset the connection 重置连接)、SYN(Synchronize sequence numbers 同步***)、FIN(No more data from sender 数据传送完毕)。
窗口(Window):目的主机使用16位的窗口字段告诉源主机它期望每次收到的数据的字节数。窗口字段是一个16位字段。
校验和(Checksum):TCP头包括16位的校验和字段用于错误检查。源主机基于部分IP头信息、TCP头和数据内容计算一个校验和,目的主机也要进行相同的计算,如果收到的内容没有错误过,两个计算结果应该完全一样,从而证明数据的有效性。
紧急指针(Urgent Pointer):紧急指针字段是一个可选的16位指针,指向段内的最后一个字节位置,这个字段只在URG标志被设置时才有效。
选项(Option):至少1字节的可变长字段,标识哪个选项(如果有的话)有效。如果没有选项,这个字节等于0,说明选项字段的结束。这个字节等于1表示无需再有操作;等于2表示下四个字节包括源机器的最大段长度(Maximum Segment Size,MSS),MSS是数据字段中可包含的最大数据量,源和目的机器对此达成一致。当一个TCP连接建立时,连接的双方都要通告各自的MSS,协商可以传输的最大段长度。常见的MSS有1024字节,以太网可达1460字节。
填充(Padding):这个字段中加入额外的零,以保证TCP头是32位的整数倍。
2.TCP连接的建立(三次握手)
三次握手过程:
(1)主机A (通常也称为客户端)发送一个标识了SYN的数据段,表示期望与服务器A建立连接,此数据段的***(seq) 为a。
(2)服务器A回复标识了SYN+ACK的数据段,此数据段的***(seq)为b,确认***为主机A的***加1 (a+1) , 以此作为对主机A的SYN报文的确认。
(3)主机A发送一个标识了ACK的数据段,此数据段的***(seq)为a+1,确认***为服务器A的***加1 (b+1) ,以此作为对服务器A的SYN报文的确认。
三次握手的核心:确认每一次包的***。
seq***范围:2^32-1,达到最大值时,从零开始。
3.TCP关闭连接(四次挥手)
四次挥手过程:
(1)主机A想终止连接,于是发送一个标识了FIN,ACK的数据段,***为a,确认***为b。
(2)服务器A回应一个标识了ACK的数据段,***为b,确认序号为a+1,作为对主机A的FIN报文的确认。
(3)服务器A想终止连接,于是向主机A发送一个标识了FIN的数据段,***为b+1,确认***为a+1。
(4)主机A回应一个标识了ACK的数据段,***为a+1,确认序号为b+1,作为对服务器A的FIN报文的确认。
总的来说:就是服务器A想要断开连接时,ACK确认字段和FIN终止字段不能同时发送。
二、UDP协议
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去。UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。
当应用程序对传输的可靠性要求不高,但是对传输速度和延迟要求较高时,可以用UDP协议来替代TCP协议在传输层控制数据的转发。UDP将数据从源端发送到目的端时,无需事先建立连接。UDP采用了简单、易操作的机制在应用程序间传输数据,没有使用TCP中的确认技术或滑动窗口机制,因此UDP不能保证数据传输的可靠性,也无法避免接收到重复数据的情况。
1. UDP头部格式
UDP报文分为UDP报文头和UDP数据区域两部分。UDP头部仅占8字节,传输数据时没有确认机制。报头由源端口、目的端口、报文长度以及校验和组成。UDP适合于实时数据传输,如语音和视频通信。相比于TCP,UDP的传输效率更高、开销更小,但是无法保障数据传输的可靠性。
UDP头部的标识:
16位源端口号:源主机的应用程序使用的端口号。
16位目的端口号:目的主机的应用程序使用的端口号。
16位UDP长度:是指UDP头部和UDP数据的字节长度。因为UDP头部长度为8字节,所以该字段的最小值为8。
16位UDP校验和:该字段提供了与TCP校验字段同样的功能;该字段是可选的。
三、TCP/UDP协议的差别
差别 |
TCP |
UDP |
是否面向连接 |
面向连接 |
面向非连接 |
传输可靠性 |
可靠 |
不可靠 |
是否流量控制 |
流量控制 |
不提供流量控制 |
应用场合 |
传输大量数据 |
传输少量数据 |
速度 |
慢 |
快 |
协议开销 |
大 |
小 |