计算机网络:运输层 —— TCP/IP运输层中的两个重要协议
文章目录
- TCP 协议
- 工作方式
- 建立连接(三次握手)
- 释放连接(四次挥手)
- 首部格式
- UDP 协议
- 首部格式
- 适用场景
- TCP 与 UDP 的对比
- 无连接的UDP和面向连接的TCP
- 对单播、多播和广播的支持情况
- 对应用层报文的处理
- 对数据传输可靠性的支持情况
- UDP首部和TCP首部的对比
- UDP TCP常用端口
我们来简单介绍一下 TCP/IP 运输层中的两个重要协议—— TCP 协议 与 UDP 协议
TCP 协议
TCP
(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层(运输层)通信协议。
主要特点:
- 可靠性高:
- 序列号与确认应答:发送数据时,TCP 会为每个字节的数据都进行编号,即序列号。接收方收到数据后,会返回一个确认应答,告知发送方已成功接收的数据的序列号。通过这种方式,发送方可以确认数据是否被正确接收,如果在一定时间内没有收到确认应答,就会认为数据丢失并进行重传。
- 校验和:TCP 在发送和接收数据时都会计算校验和。校验和是根据数据内容计算出的一个数值,用于检测数据在传输过程中是否发生错误。如果接收方计算出的校验和与发送方发送的校验和不一致,就会丢弃该数据,并通知发送方重传。
- 面向连接:在数据传输之前,需要先建立 TCP 连接。这个连接是双向的,一旦连接建立,就可以在连接上进行可靠的数据传输。连接的建立通过三次握手过程实现,连接的释放通过四次挥手过程完成。
- 流量控制:TCP 使用滑动窗口机制进行流量控制。接收方会告知发送方自己的接收窗口大小,发送方根据这个窗口大小来控制发送数据的速度,确保不会发送过多的数据导致接收方无法处理。
- 拥塞控制:TCP 具有拥塞控制机制,用于避免网络拥塞。当网络拥塞时,TCP 会减少发送数据的速度;当网络状况好转时,再逐渐增加发送速度。拥塞控制算法主要包括慢启动、拥塞避免、快速重传和快速恢复等部分。
TCP 协议具有可靠传输、面向连接等特点,适用于对数据传输可靠性要求较高的应用场景,如文件传输、电子邮件、网页浏览等。
工作方式
建立连接(三次握手)
- 第一次握手:客户端向服务器发送一个
SYN
报文(同步报文段),请求建立连接。此时客户端进入SYN_SENT
状态。 - 第二次握手:服务器收到客户端的
SYN
报文后,会向客户端发送一个SYN + ACK
报文(同步确认报文段),表示收到了客户端的请求,并同意建立连接。此时服务器进入SYN_RECV
状态。 - 第三次握手:客户端收到服务器的
SYN + ACK
报文后,会向服务器发送一个ACK
报文(确认报文段),确认收到了服务器的SYN
报文。此时客户端和服务器进入ESTABLISHED
状态,连接建立成功,可以开始传输数据。
释放连接(四次挥手)
- 第一次挥手:主动关闭方(通常是客户端)发送一个
FIN
报文(结束报文段),表示不再发送数据,请求关闭连接。此时主动关闭方进入FIN_WAIT_1
状态。 - 第二次挥手:被动关闭方(通常是服务器)收到
FIN
报文后,会发送一个ACK
报文,确认收到了主动关闭方的关闭请求。此时被动关闭方进入CLOSE_WAIT
状态,主动关闭方进入FIN_WAIT_2
状态。 - 第三次挥手:被动关闭方处理完剩余的数据后,也会发送一个
FIN
报文,请求关闭连接。此时被动关闭方进入LAST_ACK
状态。 - 第四次挥手:主动关闭方收到被动关闭方的 FIN 报文后,会发送一个
ACK
报文,确认收到了被动关闭方的关闭请求。此时主动关闭方进入TIME_WAIT
状态,等待一段时间后(通常为 2 倍的报文最大生存时间MSL
),进入CLOSED
状态,被动关闭方收到ACK
报文后,也进入CLOSED
状态,连接彻底关闭。
首部格式
- 源端口和目的端口:各占 16 位,用于标识数据的发送方和接收方的应用程序进程。
- 序列号:32 位,用于对发送的数据字节进行编号,确保数据的顺序。
- 确认应答号:32 位,是接收方期望收到的下一个数据的序列号,用于确认数据的接收。
- 数据偏移:4 位,指示
TCP
首部的长度,单位是 4 字节。 - 标志位:共 6 位,包括
URG
(紧急指针有效)、ACK
(确认号有效)、PSH
(推送功能)、RST
(复位连接)、SYN
(请求建立连接)、FIN
(通知对方本端要关闭连接)。 - 窗口:16 位,用于表示接收方的接收窗口大小,即接收方能够接收的数据量。
- 校验和:16 位,用于检验数据的正确性。
- 紧急指针:16 位,只有在
URG
(紧急指针有效)标志位被设置时才有意义,表示紧急数据的偏移量。
UDP 协议
UDP
(User Datagram Protocol,用户数据报协议)是一种无连接的、不可靠的传输层(运输层)协议。
主要特点:
-
无连接
UDP
在通信之前不需要建立连接,直接将数据封装成UDP
数据报进行发送。这就像发送一封普通的信件,不需要事先与收件人建立联系,直接投入邮筒即可。- 这种无连接的特性使得
UDP
通信非常快速和高效,适用于一些对实时性要求较高、但对数据可靠性要求相对较低的场景。
-
不可靠传输
UDP
不保证数据一定能够到达目的地,也不进行数据的重传和确认。如果数据在传输过程中丢失或损坏,UDP
不会采取任何措施进行修复。UDP
传输的数据可能会出现丢失、乱序、重复等问题。但对于一些实时性要求极高的应用,如视频会议、在线游戏等,偶尔的数据丢失并不会对用户体验产生太大影响,而快速的传输速度更为重要。
-
面向数据报
UDP
是面向数据报的协议,即一次发送一个完整的数据报,接收方也一次接收一个完整的数据报。数据报之间是相互独立的,不存在像TCP
那样的字节流概念。- 每个
UDP
数据报都有固定的长度限制,理论上最大长度为 65507 字节(65535 字节减去 UDP 首部的 8 字节和 IP 首部的 20 字节)。但在实际应用中,由于网络环境等因素的限制,通常不会发送这么大的数据报。
首部格式
- 源端口号(16 位):用于标识发送数据报的应用程序进程。
- 目的端口号(16 位):用于标识接收数据报的应用程序进程。
- 长度(16 位):指示 UDP 数据报的总长度,包括首部和数据部分。
- 校验和(16 位):用于检测 UDP 数据报在传输过程中是否出现错误。如果校验和计算结果为 0,则表示数据报没有错误;如果校验和不为 0,则表示数据报出现了错误,接收方可以选择丢弃该数据报。
适用场景
-
实时多媒体应用:如视频会议、在线直播、语音通话等。这些应用对实时性要求非常高,不希望因为数据重传等机制而引入延迟。即使偶尔出现数据丢失,也不会对用户体验产生太大影响。
-
多播和广播应用:UDP 支持多播和广播通信,可以将数据同时发送给多个接收者。这在一些需要进行大规模数据分发的场景中非常有用,如网络电视、在线游戏更新等。
-
简单的请求 - 响应应用:对于一些简单的请求 - 响应式的应用,如域名系统(DNS)查询,UDP 可以快速地发送请求并接收响应,而不需要建立复杂的连接和进行可靠的数据传输。
TCP 与 UDP 的对比
无连接的UDP和面向连接的TCP
此处的连接指逻辑连接关系,而不是物理连接。
-
UDP协议:
UDP
是一种无连接、不可靠的数据传输协议。- 在
UDP
中,发送方直接将数据包发送到接收方,中间没有建立连接的过程。 - 数据传输过程中不会进行确认或重传机制,因此可能存在数据丢失的情况。
-
TCP 协议:
-
TCP
是一种面向连接、可靠的传输协议。 -
在
TCP
中,发送方与接收方之间需要先建立一个连接,这个过程称为“三报文握手”。 -
建立连接后,基于
TCP
连接进行数据传输。TCP
会确保数据的可靠传输,包括错误检测、重传等机制。 -
传输完成后,双方还需要通过“四报文挥手”来释放
TCP
连接。
-
对单播、多播和广播的支持情况
-
UDP支持单播、多播和广播
-
TCP仅支持单播(可靠通信)
对应用层报文的处理
UDP对应用进程交付下来的报文既不合并也不拆分,而是保留这些报文的边界。即,UDP是面向应用报文的。
TCP是面向字节流的
-
发送方的 TCP 把应用进程交付下来的应用报文仅仅看作一连串的,无结构的字节流, TCP 并不知道这些待传输的字节流的含义,仅将它们编号并存储在自己的发送缓存中。 TCP 根据发送策略,从发送缓存中提取一定数量的字节,并给其添加一个首部,使之成为TCP报文段并进行发送。
-
接收方的 TCP,一方面从所接收到的 TCP 报文段中,取出数据载荷并存储在接收缓存中,另一方面,将接收缓存中的一些字节向上交付给应用进程。
-
TCP 不保证 接收方应用进程所接收到的数据块,与发送方应用进程所发出的应用层报文之间具有对应大小的关系。
例如,发送方应用进程交给发送方的 TCP 共 10 个应用层报文,但接受方的 TCP 可能只用了 4 个数据块,就把收到的字节流交付给了上层的应用进程,但接收方应用进程收到的字节流,必须和发送方应用进程发出的字节流完全一样。接收方的应用进程必须有能力识别收到的字节流,把它还原成有意义的应用层报文。
在实际网络中,基于 TCP 连接的两端,可以同时进行 TCP 报文段的发送和接收,也就是全双工通信。
对数据传输可靠性的支持情况
-
UDP 不保证数据的顺序、完整性和到达情况。数据可能在网络中丢失、出现乱序或重复,接收方收到数据后不做任何处理,产生误码的数据直接丢弃。
-
对于 TCP,发送方和接收方之间需要建立连接,并且在传输结束后关闭连接。发送方通过 TCP 向接收方发送数据,TCP 协议负责处理数据的排序、重发和流量控制,提供可靠的数据传输,确保数据的完整。
UDP首部和TCP首部的对比
UDP TCP常用端口
端口号 | 协议 | 说明 |
---|---|---|
21 | TCP | FTP服务器所开放的端口,用于上传、下载 |
22 | TCP | PcAnywhere建立的TCP连接的端口 |
23 | TCP | Telnet远程登录TCP连接的端口 |
25 | TCP | SMTP服务器所开放的端口,用于发送邮件 |
53 | TCP | DNS服务器所开放的端口 |
80 | TCP | HTTP端口,用于网页浏览 |
137 | UDP | NetBios命名服务 |
138 | UDP | NetBios数据报服务 |
139 | TCP | NetBios会话服务,当通过网上邻居传输文件时用137、138和139端口 |
161 | UDP | 简单网络管理协议SNMP |
443 | TCP/UDP | HTTPS网页浏览端口,提供加密和安全传输 |
1433 | TCP | SQL Server数据库服务器开放的端口 |