TCP 与 UDP 协议
内容列表
传输层是网络分层模型中举足轻重的层,它是底层通信子网与高层资源子网的接口与桥梁,提供了面向连接的传输控制协议(Transmission Control Protocol,TCP)和无连接的用户数据报协议(User Datagram Protocol,UDP),负责提供端到端的数据传输服务。
传输层协议
传输层在两个应用实体之间实现可靠的、透明的、有效的端到端数据传输服务,其主要的功能为以下几个方面:
- 创建进程间通信,进程即正在运行的应用程序。
- 提供控制机制,如流量控制,差错控制等。
- 提供连接机制。
TCP 协议
TCP(Transmission Control Protocol,传输控制协议)是传输层最重要和最常用的协议。它提供了面向连接的、可靠的数据传输服务,保证了端到端数据传输的可靠性。以下为 TCP 协议的特点:
面向连接
两个需要通过 TCP 进行数据传输的进程之间首先必须建立一个逻辑连接(虚电路),即 TCP 连接;在数据传输完成后需要关闭(释放)连接。一般将发出请求连接的应用进程称为客户进程,而将响应连接的应用进程称为服务器进程,即 TCP 连接的建立采用的是一种客户/服务器模型。
全双工
提供全双工数据传输服务,只要建立了 TCP 连接,就能在两个进程间进行双向的数据传输服务,但是这种传输只是端到端的传输,不支持广播和多播。
可靠
提供流量控制、拥塞控制、差错控制,从而保证数据传输的可靠性。
基于字节流
提供面向字节流的服务,两个建立了 TCP 连接的应用进程间之间交换的是字节流。在传输层上数据被当作没有信息的字节序列来对待。
TCP 比较安全、稳定,但由于每次传输数据时都要先建立连接,并在传送完成后关闭连接,所以效率比较低,而且占用的资源也比较多。TCP 协议的主要作用是在计算机之间可靠的传输数据,将具有一定可靠性的流式通信服务提供给应用程序。
UDP 协议
UDP(User Datagram Protocol,用户数据报协议)是不可靠的无连接的基于数据报的协议,支持无连接 IP 数据报的通信方式。相对于 TCP 协议来说,UDP 是一种非常简单的协议,在网络层的基础上实现了进程之间端到端的通信。以下为 UDP 协议的特点:
无连接
传输数据之前双方不需要建立连接,因此不存在连接建立的时延。
无需维护
传输数据不需要维护连接状态,包括收发状态等,这样一台服务器可同时向多个客户端传输相同的数据,如实现多播。
报文首部短
UDP 数据报首部只有 8 字节,相对于 TCP 的 20 字节首部的开销要小很多。
吞吐量不受控制
吞吐量不受流量控制算法的调节,只受应用软件生成数据报的速率、传输带宽、信源和信宿主机性能的限制。
UDP 的不可靠性并不影响 UDP 的可用性。在没有严格可靠性要求的情况下,UDP 避免了 TCP 面向连接的消耗,反而能提高传输速率和降低资源占用,非常适合于简单查询和响应类型的通信,如广播、路由、多媒体等广播形式的通信任务。
进程间通信
传输层以下各层(通信子网)只提供相邻节点之间的点到点传输。例如,IP 协议负责在网络节点之间的通信,即主机之间的通信。作为网络层协议,IP 只能将报文交付给目的主机,但是这是一种不完整的交付,因为这个报文还必须送交到相应的进程。传输层提供端到端的数据传输,即源进程到目的进程的端到端通信。
由于在一台计算机中同时存在多个进程,进程之间要进行通信,首先要解决进程的标识问题。为了保证数据能够正确地到达指定的目的进程,必须显示地给出全局唯一的目的进程标识符。主机可以用 IP 地址进行标识,IP 地址是全局唯一的;然后我们再给主机上的进程赋予一个本地唯一的标识符端口号(Port Number)。为了区别 TCP 和 UDP 的进程,还要指明协议。因此,我们要全局唯一地标识一个进程,必须采用一个三元组来表示:<协议,主机 IP 地址,端口号>。
网络通信是两个进程之间的通信,两个进程相关联,因为采用的是同一种协议通信,可以用一个五元组来描述两个进程的关联:
<源 IP 地址,源端口号,协议,目的 IP 地址,目的端口号>。
TCP 连接机制
TCP 提供的是面向连接的数据传输服务,所以在进行数据传输前通信双方要建立 TCP 连接,数据传输完成后又要关闭 TCP 连接。我们可以将这个过程大致描述为:
- TCP 连接建立(三次握手)
- 数据传输(保持连接)
- TCP 连接关闭(四次挥手)
连接建立(三次握手)
通信双方在使用 TCP 传输数据之前,要建立一个稳定、可靠的 TCP 连接,这个连接建立过程形象地称为“三次握手”。下面来具体分析这个过程:
第一次握手
客户端(源主机)向服务器(目的主机)发送 TCP 连接建立请求(又称 SYN 段),其中标志 SYN=1,ACK=0;序列号为客户端初始序列号(简称 ISN);目的端口号为所请求的服务(进程)对应的端口。同时客户端启动计时器,等待接受服务器的应答。这个 SYN 段不携带任何数据,但是它消耗一个序列号。这一步客户端执行主动打开(Action Open)。
第二次握手
服务器收到客户端的 TCP 连接建立请求后,将回应一个 TCP 连接建立应答(又称 SYN/ACK 段),其中标志 SYN=1,ACK=1;序列号为服务器初始序列号;确认号为客户端初始序列号加 1;目的端口号为客户端的源端口号。同时服务器启动计时器,等待接受客户端的应答。这个 SYN/ACK 段不携带数据,但消耗一个序列号。这一步服务器执行被动打开(Passive Open)。
第三次握手
客户端计时器超时前若收到服务器的应答报文,客户端会向服务器发送一个 TCP 连接建立确认报文(又称 ACK 段),其中标识 SYN=0,ACK=1;序列号为客户端初始序列号加 1;确认号为服务器初始序列号加 1。这个 ACK 段若不携带数据,则不消耗序列号。
至此,服务器计时器超时前若收到客户端确认报文,则 TCP 连接正式建立。
“三次握手”的过程大致可以描述为:客户端发送(主动)连接建立请求——>服务器接收请求,发送(被动)连接建立请求和应答信息——>客户端发送连接建立确认信息。
数据传输(保持连接)
在完成“三次握手”的过程后,通信双方的 TCP 连接正式建立,此时就可以进行数据双向传输了。
客户端和服务器都可以在两个方向上进行数据传输和确认。客户端和服务器分别记录对方的序列号,序列号的作用是为了同步数据。客户端向服务器发送数据报文,服务器收到后会回复一个带有 ACK 标志的确认报文段。客户端收到该确认报文段,就知道数据已经成功发送,否则,报文将被重新发送。接着它继续向服务器发送报文。
建立 TCP 连接之后,可以保持连接以免每次发送数据都要重复执行握手过程。这样,即使没有数据在 TCP 链路上传送,仍旧能够维持连接。通常应用层可以实现连接保持,如 FTP。如果应用程序不能保持连接,则可以由服务器发起 TCP 保持连接。
连接关闭(四次挥手)
双方在完成数据传输后,可以关闭 TCP 连接,释放资源同时也能准备为其他进程提供服务,而这个关闭(释放)连接的过程也被形象地称为“四次挥手”。**至于为何建立连接是“三次握手”,而关闭连接却是“四次挥手”,是因为 TCP 连接是全双工的,支持通信双方进行双向数据传输,所以每个方向上都必须单独关闭。**下面来具体分析这个过程:
第一次挥手
客户端向服务器发送 TCP 连接关闭请求(又称 FIN 段),其中标志 FIN=1。主动关闭客户端到服务器的数据传送。
第二次挥手
服务器收到客户端的 TCP 连接关闭请求后,将回应一个 TCP 连接关闭应答(又称 ACK 段),其中标志 ACK=1。并通知己方(服务器)应用程序关闭。
第三次挥手
服务器收到己方应用程序关闭信息后,向客户端发送 TCP 连接关闭请求(又称 FIN 段),其中标志 FIN=1。
第四次挥手
客户端收到服务器的 TCP 连接关闭请求后,将回应一个 TCP 连接关闭应答(又称 ACK 段),其中标志 ACK=1。
至此,服务器收到客户端应答报文后会单向关闭 TCP 连接,稍后客户端也会单向关闭 TCP 连接,这样 TCP 连接就同时双向关闭了。
“四次挥手”的过程大致可以描述为:客户端发送(主动)连接关闭请求——>服务器接受请求,发送应答信息,并通知应用程序关闭——>服务器应用程序已关闭,发送(被动)连接关闭请求——>客户端接受请求,并发送应答信息。
要注意的是,四次挥手过程中主动发起连接关闭方既可以是客户端(Client)也可以是服务器(Server)。
结语
对于 TCP 和 UDP 协议的报文格式,以及 TCP 连接整个过程我们可以使用 Wireshark 软件来监测,并进行具体的分析,这样我们可以直观的了解它们,也能帮助我们更好的理解。