传输层定义了主机应用程序之间端到端的连通性。
传输层中最为常见的两个协议分别:
- 传输控制协议TCP(Transmission Control Protocol)
- 用户数据包协议UDP(User Datagram Protocol)
1.传输控制协议TCP
TCP位于TCP/IP模型的传输层,它是一种面向连接的端到端协议。可以为主机提供可靠的数据传输。
|
![](https://img2020.cnblogs.com/blog/2269756/202109/2269756-20210904164533466-1461903557.png) |
特点:
- TCP协议是面向连接的运输层协议。在数据传输前必须建立连接,数据传输之后释放连接。
- TCP提供可靠的交互服务。所谓可靠是指在传输过程中无重复,无丢失,无错误。但是同时会增加开销。
- 每一条连接都是点对点连接(一对一)
- 面向字节流。所谓字节流指的是以传输过程中流入进程和流出进程的字节序列,虽然传输过程中是一个一个数据报,但这只是为了方便传输,之后在目的端重新装配。
- TCP提供全双工通信。所谓全双工是指一端既可以是客户端,也可以是服务器。
|
1.1 TCP端口号
端口号用来区分不同的网络服务。
TCP允许一个主机同时运行多个应用进程。每台主机可以拥有多个应用端口,每对端口号、源和目标IP地址的组合唯一地标识了一个会话。 |
![](https://img2020.cnblogs.com/blog/2269756/202109/2269756-20210905074650565-1121922803.png) |
端口分为知名端口和动态端口。
- 有些网络服务会使用固定的端口,这类端口称为知名端口,端口号范围为0-1023。如FTP、HTTP、Telnet、SNMP服务均使用知名端口。
- 动态端口号范围从1024到65535,这些端口号可以自定义分配,也就是说许多服务都可以使用这些端口。只要运行的程序向系统提出访问网络的申请,那么系统就可以从这些端口号中分配一个供该程序使用。
|
1.2 TCP头部报文结构
![](https://img2020.cnblogs.com/blog/2269756/202109/2269756-20210905075136495-1471102047.png) |
TCP头部有20个固定字节,选项部分长度不定,最多40个字节。
- 源端口(Source Port):占2个字节。端口是指传输层和应用层的服务端口。
- 目的端口(Destination Port):占2个字节。端口是指传输层和应用层的服务端口。
- TCP序列号(Sequence Number):占4个字节。范围是0—2^32-1。因为TCP是面向字节流,所以它为每一个字节进行编号。在网络中传输时,它们的顺序可能会发生变化;接收端依据此序列号,便可按照正确的顺序重组数据。
- 确认号(Acknowledge Number):占4个字节,是期望收到下一个报文段的数据部分的第一个序号。用于标识接收端确认收到的数据段。确认序列号为成功收到的数据序列号加1。
- 数据偏移:占4个字节。是指TCP报文段的数据开始的部分距TCP报文段起始部分的偏移量,也就是TCP头部报文的长度。
- 保留字段:占6个字节。
- 标识符:
- URG:当URG置1时,表示紧急指针有效,它告诉系统此报文段有紧急数据,应尽快传送。
- ACK:ACK置1,表示确认号字段才有效。此外,TCP规定,建立连接后,传输的所有报文段的ACK都需要被置1.
- PSH:当接收者收到PSH=1时,会立即把数据传输给应用程序,而不会等到缓冲区满了,再做提交。
- RST:RST=1,表示TCP连接出现了严重的问题,必须释放重连。
- SYN:建立连接的时候使用。当SYN=1,ACK=0时,表示为请求连接;当SYN=1,ACK=1时,表示为同意连接的请求应答。
- FIN:FIN=1,表示请求释放连接。
- 窗口(Window):占2个字节,表示接受端的接收窗口的大小。用于实现流量控制。将接收端发送过去的窗口大小设置成发送端的发送窗口大小,从而控制了发送端的发送效率。
- 校验和(Checksum):用于检测发送过程中是否出现错误。校验整个TCP报文段,包括TCP头部和TCP数据。该值由发送端计算和记录并由接收端进行验证。
- 紧急指针(Urgent Pointer):用于标识紧急数据的尾部。
- 选项字段:(需要掌握的几个选项)MMS—最大报文长度,实际是报文段的最大数据长度。窗口扩大因子。时间戳选项。
|
1.3 TCP建立连接——三次握手
![](https://img2020.cnblogs.com/blog/2269756/202109/2269756-20210905095802946-383899201.png) |
TCP连接的建立是一个三次握手的过程。如图所示:
- 主机A(通常也称为客户端)发送一个标识了SYN的数据段,表示期望与服务器A建立连接,此数据段的序列号(seq)为a。
- 服务器A回复标识了SYN+ACK的数据段,此数据段的序列号(seq)为b,确认序列号为主机A的序列号加1(a+1),以此作为对主机A的SYN报文的确认。
- 主机A发送一个标识了ACK的数据段,此数据段的序列号(seq)为a+1,确认序列号为服务器A的序列号加1(b+1),以此作为对服务器A的SYN报文的确认。
|
1.4 TCP数据传输过程
- 数据传输过程中,应用数据被分割成TCP认为最适合发送的数据块。应用程序产生的数据报长度将保持不变。 (将数据截断为合理的长度)
- 当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。 (超时重发)
- 当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒 。 (做出响应,推迟发送是要做完整校验)
- TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段并且不会确认收到此报文段。 (校验出包有错,丢弃报文段,不给出响应,TCP发送数据端,超时时会重发数据)
- TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。 (对失序数据进行重新排序,然后才交给应用层)
- 既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。(对于重复数据,能够丢弃重复数据)
- TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。(TCP可以进行流量控制,防止较快主机致使较慢主机的缓冲区溢出)TCP使用的流量控制协议是可变大小的滑动窗口协议。
|
1.5 TCP传输过程通过确认技术保证数据正确
![](https://img2020.cnblogs.com/blog/2269756/202109/2269756-20210905100942030-1448052390.png) |
TCP的可靠传输还体现在TCP使用了确认技术来确保目的设备收到了从源设备发来的数据,并且是准确无误的。
确认技术的工作原理如下:
目的设备接收到源设备发送的数据段时,会向源端发送确认报文,源设备收到确认报文后,继续发送数据段,如此重复。
如图所示,
- 主机A向服务器A发送TCP数据段,为描述方便假定每个数据段的长度都是500个字节。
- 当服务器A成功收到序列号是M+1499的字节以及之前的所有字节时,会以序列号M+1499+1=M+1500进行确认。
- 另外,由于数据段N+3传输失败,所以服务器A未能收到序列号为M+1500的字节,因此服务器A还会再次以序列号M+1500进行确认。
|
1.6 TCP流量控制
![](https://img2020.cnblogs.com/blog/2269756/202109/2269756-20210905144118652-355167512.png) |
TCP滑动窗口技术通过动态改变窗口大小来实现对端到端设备之间的数据传输进行流量控制。
如图所示,
- 主机A和服务器A之间通过滑动窗口来实现流量控制。为方便理解,此例中只考虑主机A发送数据给服务器A时,服务器A通过滑动窗口进行流量控制。
- 主机A向服务器发送4个长度为1024字节的数据段,其中主机的窗口大小为4096个字节。服务器A收到第3个数据段后,缓存区满,第4个数据段被丢弃。服务器以ACK 3073响应,窗口大小调整为3072,表明服务器的缓冲区只能处理3072个字节的数据段。于是主机A改变其发送速率,发送窗口大小为3072的数据段。
|
1.7 TCP断开连接——四次挥手
![](https://img2020.cnblogs.com/blog/2269756/202109/2269756-20210905144250348-1965872599.png) |
TCP支持全双工模式传输数据,这意味着同一时刻两个方向都可以进行数据的传输。在传输数据之前,TCP通过三次握手建立的实际上是两个方向的连接,因此在传输完毕后,两个方向的连接必须都关闭(主机在关闭连接之前,要确认收到来自对方的ACK)。
TCP连接的建立是一个三次握手的过程,而TCP连接的终止则要经过四次握手。
如图所示:
- 主机A想终止连接,于是发送一个标识了FIN,ACK的数据段,序列号为a,确认序列号为b。
- 服务器A回应一个标识了ACK的数据段,序列号为b,确认序号为a+1,作为对主机A的FIN报文的确认。
- 服务器A想终止连接,于是向主机A发送一个标识了FIN,ACK的数据段,序列号为b,确认序列号为a+1。
- 主机A回应一个标识了ACK的数据段,序列号为a+1,确认序号为b+1,作为对服务器A的FIN报文的确认。
以上四次交互便完成了两个方向连接的关闭。
|
TCP头部中的确认标识位有什么作用?
TCP报文头中的ACK标志位用于目的端对已收到数据的确认。目的端成功收到序列号为x的字节及之前的所有字节后,会以序列号x+1进行确认。
TCP头部中有哪些标识位参与TCP三次握手?
在TCP的三次握手过程中,要使用SYN和ACK标志位来请求建立连接和确认建立连接。
2.用户数据包协议UDP
UDP是一种面向无连接的传输层协议,传输可靠性没有保证。
|
![](https://img2020.cnblogs.com/blog/2269756/202109/2269756-20210905144605376-1472001059.png) |
当应用程序对传输的可靠性要求不高,但是对传输速度和延迟要求较高时,可以用UDP协议来替代TCP协议在传输层控制数据的转发。
UDP将数据从源端发送到目的端时,无需事先建立连接。UDP采用了简单、易操作的机制在应用程序间传输数据,没有使用TCP中的确认技术或滑动窗口机制,因此UDP不能保证数据传输的可靠性,也无法避免接收到重复数据的情况。UDP适合于实时数据传输,如语音和视频通信。相比于TCP,UDP的传输效率更高、开销更小,但是无法保障数据传输的可靠性。
|
2.1 UDP报文头部结构
![](https://img2020.cnblogs.com/blog/2269756/202109/2269756-20210905144837405-1443494957.png) |
UDP头部仅占8字节,传输数据时没有确认机制。UDP报文分为UDP报文头和UDP数据区域两部分。报头由源端口、目的端口、报文长度以及校验和组成。
UDP头部的标识如下:
- 16位源端口号:源主机的应用程序使用的端口号。
- 16位目的端口号:目的主机的应用程序使用的端口号。
- 16位UDP长度:是指UDP头部和UDP数据的字节长度。因为UDP头部长度为8字节,所以该字段的最小值为8。
- 16位UDP校验和:该字段提供了与TCP校验字段同样的功能;该字段是可选的。
|
2.2 UDP传输过程
使用UDP传输数据时,由应用程序根据需要提供报文到达确认、排序、流量控制等功能。
|
![](https://img2020.cnblogs.com/blog/2269756/202109/2269756-20210905145358636-1780544436.png) |
主机A发送数据包时,这些数据包是以有序的方式发送到网络中的,每个数据包独立地在网络中被发送,所以不同的数据包可能会通过不同的网络路径到达主机B。
这样的情况下,先发送的数据包不一定先到达主机B。因为UDP数据包没有序号,主机B将无法通过UDP协议将数据包按照原来的顺序重新组合,所以此时需要应用程序提供报文的到达确认、排序和流量控制等功能。
|
通常情况下,UDP采用实时传输机制和时间戳来传输语音和视频数据。
|
![](https://img2020.cnblogs.com/blog/2269756/202109/2269756-20210905150021852-2012465658.png)
|
一些时延敏感的流量,如语音、视频等,通常使用UDP作为传输层协议。
在使用TCP协议传输数据时,如果一个数据段丢失或者接收端对某个数据段没有确认,发送端会重新发送该数据段。
TCP重新发送数据会带来传输延迟和重复数据,降低了用户的体验。对于时延敏感的应用,少量的数据丢失一般可以被忽略,这时使用UDP传输将能够提升用户的体验。(UDP不提供重传机制,占用资源小,处理效率高。)
|