TCP协议
1、介绍
- 传输控制协议,属于传输层,在程序间传输数据
- 是一种面向连接的、可靠的、基于字节流的传输层通信协议
- 提供可靠的数据传输(在传输数据之前需要建立连接,当数据传输完成后,需要释放连接)
- TCP建立连接的三次握手过程
- TCP释放连接的四次挥手过程
- 仅支持单播传输
2、报文格式
- TCP报文格式
- Source Port(源端口): 50860 (50860),一般随机端口
- Destination Port(目的端口): pando-pub (7680),一般是固定的
- Sequence number: 1 (relative sequence number)
- Sequence number (raw): 698089134,同步序号,只有flags位SYN时才有效
- Acknowledgment number: 129 (relative ack number)
- Acknowledgment number (raw): 2316433842,确认序号
- 0101 … = Header Length(首部长度): 20 bytes (5)
- flags
- URG:紧急位,标识紧急指针是否有效
- ACK:确认位,确认序号是否有效
- PSH:标识收到的数据先缓存还是直接递交给上层
- RST:重置位
- SYN:同步序号位,请求建立连接
- FIN:释放连接,数据已经传完,一般情况下立即释放连接
- Window size value(窗口大小): 1043
- Checksum(校验): 0x02ca [unverified]
- Urgent pointer(紧急指针): 0
3、TCP的三次握手
-
服务器是经历三个状态:初始下,服务器处于监听状态(listening),当服务器收到客户机的SYN报文后,进入SYN_RECV(半连接),服务器会使用一部分资源来保持一段时间,当收到客户机第三次握手后,进入establised状态(建立连接),就可以进行数据传输,当数据传输完成,会进行保持连接一段时间,是time-wait状态。如下图
-
为什么要三次握手而不是两次呢
- 为了防止已经失效的请求报文,重新传到服务器引起错误。假设是两次握手,客户端发起一次SYN请求后,由于网络阻塞没有发送到服务器;当客服端再次发送SYN请求,正常发送到服务器后,服务器响应SYN+ACK确认,建立起连接;这时客户端第一次发送的SYN请求因为网络恢复,重新传到服务器,服务器以为是客户端发起新的连接请求,再次响应SYN+ACK数据包;这时客户端认为是一个连接,服务端认为是两个连接,造成状态不一致
- 两次握手后建立连接,如果有主机恶意发送大量SYN请求,服务器收到后会响应SYN+ACK数据包,进入等待数据传输状态,会造成资源浪费,甚至服务器无法正常工作
4、TCP数据传输
-
数据传输
-
分包传输:设A向B分两次传输200字节
-
主机A通过1个数据包发送100个字节的数据,数据包的 Seq 号设置为 1200。主机B为了确认这一点,向主机A发送 ACK 包,并将 Ack 号设置为 1301。
-
为了保证数据准确到达,目标机器在收到数据包(包括SYN包、FIN包、普通数据包等)包后必须立即回传ACK包,这样发送方才能确认数据传输成功。
-
此时 Ack 号为 1301 而不是 1201,原因在于 Ack 号的增量为传输的数据字节数。假设每次 Ack 号不加传输的字节数,这样虽然可以确认数据包的传输,但无法明确100字节全部正确传递还是丢失了一部分,比如只传递了80字节。因此按如下的公式确认 Ack 号:
Ack号 = Seq号 + 传递的字节数 + 1
-
与三次握手协议相同,最后加 1 是为了告诉对方要传递的 Seq 号。
-
-
-
如何解决丢包,乱序
- 发送报文:序列号Seq、长度、数据内容
- 回复确认:Ack=Seq + 长度 +1
- 切割发送:根据序列号和长度重组
- 如果某一段报文丢失,或长度不同,则根据Ack重新传输
5、TCP的四次挥手
-
过程
- 客户端主动发起连接关闭请求,向服务端发送FIN包,客户端进入FIN-WAIT-1状态
- 服务器收到FIN包后,响应ACK报文,服务端进入CLOSE-WAIT状态,客户端收到ACK报文后进入FIN-WAIT-2状态
- 此时客户端和服务端还可以进行数据的收发
- 数据传输结束后,服务端发送FIN包,进入LAST-ACK状态
- 客户端收到FIN后,回复ACK包,进入TIME-WAIT状态,一段时间后断开连接
- 服务器收到ACK包后,直接关闭连接
-
为什么客户端收到FIN后会进入TIME-WAIT状态
- 为保证服务端已经收到ACK包。一旦发送完ACK后就立即断开连接,如果ACK包在传输过程中丢失,服务端会一直停留在LAST-ACK状态,等待ACK数据包。如果一直没有收到ACK数据包,服务端会重新发送FIN包,等待客户端进行确认
断开连接,如果ACK包在传输过程中丢失,服务端会一直停留在LAST-ACK状态,等待ACK数据包。如果一直没有收到ACK数据包,服务端会重新发送FIN包,等待客户端进行确认
UDP协议
1、介绍
- UDP是无连接的。发送数据之前不需要像TCP那样三次握手后才开始数据传输,释放连接也不需要四次挥手,所以UDP传输数据是快速的
- UDP尽最大努力交付。不能保证可靠的数据交付
- UDP是面向报文的
2、UDP报文结构
- 源端口
- 目的端口
- 长度
- 校验和
- 数据
TCP与UDP的区别
TCP | UDP |
---|---|
面向连接的 | 无连接的 |
基于字节流 | 基于数据报文 |
可靠稳定 | 不可靠、不稳定 |