目录
TCP协议
TCP协议的关键机制
序列号
确认应答
重传控制
流量控制
拥塞控制
TCP协议应用场景
TCP协议的报头
TCP协议工作原理
TCP三次握手-连接
TCP四次挥手-断开
UDP协议
UDP协议的应用场景
在线游戏
DNS查询
网络广播
流媒体应用
网络测量工具
视频会议与语音通话
网络管理与监控
物联网(IoT)设备
UDP协议的报头
二者的区别
是否面向连接
可靠性
服务实时性
连接模式
资源占用
TCP协议
TCP(传输层控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在网络OSI七层模型中,TCP工作在第四层——传输层,它的主要任务是提供一个可靠的、端对端的数据传输服务
TCP协议的关键机制
序列号
TCP协议为每一个传输的字节分配一个序列号,以便接收方能够按照正确的顺序重新组装数据。
确认应答
接收方在接收到数据后,会发送一个确认应答报文,告知发送方已经成功接收到指定序列号的数据。
重传控制
如果发送方在规定的时间内没有收到某个数据包的确认应答,则会认为该数据包已经丢失,并重新发送该数据包。
流量控制
TCP协议使用滑动窗口机制来控制发送方与接收方的数据传输速度,确保接收方能够及时处理接收到的数据而不会发生数据溢出。
拥塞控制
TCP协议通过慢启动、拥塞避免等机制来控制数据的发送速度,避免网络拥塞并提高网络的利用率。
TCP协议应用场景
TCP协议适用于对数据传输可靠性要求较高的场景,如网页浏览、文件传输等。在这些场景中,数据的完整性、顺序性和可靠性至关重要。TCP协议通过其可靠的传输机制和一系列的控制策略,确保了数据传输的可靠性和稳定性。
TCP协议的报头
- 源端口:
- 占用2字节。
- 标识发送方应用程序使用的端口号。
- 目的端口:
- 占用2字节。
- 标识接收方应用程序使用的端口号,即发送方应用程序的目标端口号。
- 序列号:
- 占用4字节。
- 标识TCP报文段中的第一个字节数据的序列号。TCP会对数据流中的每个字节数据进行编号,用于保证传输数据的可靠性和顺序性。
- 确认号:
- 占用4字节。
- 标识接收方期望收到的下一个报文段的起始序号。只有标志位ACK为1时,确认号才有效。
- 数据偏移:
- 占用4位(0.5字节)。
- 标识TCP报文段中报文数据的起始位置距离报文段开始位置有多远,即TCP的首部长度。单位是32位(4字节)。由于TCP报头固定长度为20字节,最大长度为60字节,因此数据偏移值最小是5(表示20字节的固定长度),最大是15(表示60字节的最大长度)。
- 保留:
- 占用6位(0.75字节)。
- 预留给未来使用的一组控制位,目前该值设置为0。在RFC 9293版本中,保留位可能有所变化,但通常仍被设置为0。
- 标志位:
- 占用8位(1字节),但通常只使用其中的几位。
- 包括多个标志位,每个标志位占用1位,用于控制TCP的拥塞、连接的建立、管理和关闭等。常见的标志位有:
- URG:紧急标志字段,用于指示紧急指针字段是否有效。
- ACK:确认标志字段,用于指示确认字段是否有效。
- PSH:急迫标志字段,用于要求马上发送数据。
- RST:复位标志字段,用于对本TCP连接进行复位,还可以用于拒绝非法的数据段或数据连接。
- SYN:同步标志字段,用于发起连接请求,携带SYN标志的报文段被称为同步报文段。
- FIN:终止标志字段,用来释放TCP连接,携带FIN标志的报文段被称为结束报文段。
- 窗口大小:
- 占用2字节。
- 通过窗口大小字段的值告知对方自己接收窗口的大小,用于实现TCP的流量控制和差错恢复。
- 校验和:
- 占用2字节。
- 用于校验TCP报文段头部、用户数据以及一个伪TCP头部的正确性。如果校验失败,则认为数据在传输过程中受损。
- 紧急指针:
- 占用2字节。
- 指出本报文段中紧急数据的字节位置,只有在URG=1时才有效。紧急数据会放在TCP报文段数据部分的最前端,紧急指针用于标识紧急数据在TCP报文段数据部分的结束位置。
TCP协议工作原理
TCP三次握手-连接
- 第一次握手:客户端向服务器发送一个SYN(同步序列编号)报文,并等待服务器确认。
- 第二次握手:服务器收到SYN报文后,会发送一个SYN-ACK(同步序列编号-确认)报文作为响应,表示同意建立连接,并等待客户端确认。
- 第三次握手:客户端收到SYN-ACK报文后,会发送一个ACK(确认)报文,表示已确认连接建立。此时,双方进入ESTABLISHED(已建立连接)状态,可以进行数据传输。
TCP四次挥手-断开
- 第一次挥手:客户端或服务器任一端发送一个FIN(结束)报文,表示希望断开连接。
- 第二次挥手:对方收到FIN报文后,会发送一个ACK报文作为响应,表示已确认接收到断开连接的请求。
- 第三次挥手:如果之前还有未传输完的数据,则继续传输。当所有数据都传输完毕后,发送FIN报文的一方再次发送一个FIN报文,表示已没有数据需要传输。
- 第四次挥手:对方收到这个FIN报文后,发送一个ACK报文作为响应,表示已确认接收到断开连接的最终请求。此时,双方连接完全断开。
UDP协议
UDP用户数据报协议是OSI参考模型中一种无连接的传输层协议,具有低延迟和高效的特性,它适用于许多实时和高性能的应用场景。
UDP协议的应用场景
在线游戏
尤其是实时多人在线游戏,UDP协议能够快速处理海量数据包,确保游戏的流畅进行。
DNS查询
DNS服务基于UDP协议,能够快速解析域名。
网络广播
UDP支持广播功能,可以迅速、高效地传达信息给多个接收者。
流媒体应用
如Spotify和某些直播服务,使用UDP来确保音频和视频的流畅传输。尽管UDP不保证数据的可靠性,但对于实时性较为重要的流媒体应用而言,这是可以接受的。
网络测量工具
如iperf,使用UDP进行网络性能测试。由于UDP的简单和快速特性,它适用于需要快速传输大量数据的性能测试场景。
视频会议与语音通话
如Zoom、Skype、WhatsApp、Viber等,使用UDP进行实时音频和视频传输,确保最低的延迟。
网络管理与监控
如DHCP(动态主机配置协议)、SNMP(简单网络管理协议)等,通过UDP进行信息传递。
物联网(IoT)设备
许多IoT应用使用UDP来传输传感器数据,以减少延迟和节省带宽。
UDP协议的报头
- 源端口号:
- 占用2个字节。
- 表示发送数据报的应用程序所在的端口。
- 用于标识发送数据报的应用程序,以便接收方能够知道数据是由哪个应用程序发送的。
- 在需要对方回信时,接收方可以使用这个源端口号作为目的端口号来回复数据。
- 目的端口号:
- 占用2个字节。
- 表示接收数据报的应用程序所在的端口。
- 用于确定数据报应该交给哪个应用程序处理。
- 在终点交付报文时,这个字段是必须要使用的。
- 数据报长度:
- 占用2个字节。
- 表示整个UDP数据报的长度,包括UDP头部和数据部分。
- 这个字段告诉接收方整个数据报的大小,以便接收方能够正确地解析和处理数据报。
- 最小值是8字节,因为UDP头部的长度固定为8字节。理论上,数据报长度最大可以达到65535字节(包括报文头在内),但实际使用中可能会受到环境限制。
- 校验和:
- 占用2个字节。
- 用于验证UDP报文在传输过程中是否发生了错误。
- 发送方在发送数据报之前会计算校验和,并将其放在这个字段中。
- 接收方在收到数据报后,会重新计算校验和,并与发送方提供的校验和进行比较。
- 如果两者不一致,说明数据报在传输过程中发生了错误,接收方可以选择丢弃这个数据报。
二者的区别
是否面向连接
TCP面向连接,UDP是无连接的
TCP在开始数据传输之前要经过三次握手,UDP却不需要任何准备即可进行数据传输,因此UDP不会引入建立连接的时延
可靠性
TCP提供可靠的服务,UDP尽最大努力交付,即不保证可靠交付
TCP传输数据具有重传机制,如果在传输数据的过程中发生丢包事件,发送方会重传丢失的分组,所以TCP保证发送的分组一定能到达接收方,因此是可靠的。
UDP在应用层得到数据后,附加上用于多路复用/多路分解服务的源端口号和目的端口号字段后,直接将形成的报文段传输给网络,而网络层是不可靠的,因而不能保证数据传输的可靠性。(可以在应用层实现UDP数据传输的可靠性)
服务实时性
UDP具有较好的实时性,工作效率比TCP高
UDP在传输数据前不需要建立连接,没有繁琐的握手过程,没有复杂的拥塞控制算法和重传机制,所以UDP相对于TCP具有较高的效率。
连接模式
每一条TCP连接只能是点到点,UDP支持一对一、一对多、多对多
资源占用
TCP对系统资源要求较多,UDP对系统资源要求较少
TCP建立连接后,会为连接分配发送缓存和接受缓存,维护拥塞控制变量以及序号和确认号的参数,因此需要占用较多的系统资源。而UDP是无连接的,对系统资源要求较少