一、传输层协议概述
传输层定义了主机应用程序之间端到端的连通性。传输层中最为常见的两个协议分别是传输控制协议TCP(Transmission Control Protocol)和用户数据包协议UDP(User Datagram Protocol)。
二、TCP
2.1 TCP介绍
TCP是一种面向连接、可靠的、基于数据流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内另一个重要的传输协议。在因特网协议族中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。
TCP位于TCP/IP模型的传输层,它是一种面向连接的端到端协议。TCP作为传输控制协议,可以为主机提供可靠的数据传输。TCP需要依赖网络协议为主机提供可用的传输路径。在本例中,两台主机在通信之间,需要TCP在它们之间建立可靠的传输通道。
2.2 TCP端口号
TCP允许一个主机同时运行多个应用程序。每台主机可以拥有多个应用端口,每对端口号、源和目标IP地址的组合唯一地标识了一个会话。端口分为知名端口和动态端口。有些网络服务会使用固定地端口,这类端口称为知名端口,端口号范围为0-1023。如FTP、HTTP、Telnet、SNMP服务均使用知名端口。动态端口号范围从1024到65535,这些端口号一般不固定分配给某个服务,也就是说许多服务都可以使用这些端口。只要运行的程序向系统提出访问网络的申请,那么系统就可以从这些端口号中分配一个供该程序使用。
2.3 TCP头部
- 因为存在Option选项,所以TCP头部长度不固定,最小为20字节,最大为60字节。
TCP通常使用IP作为网络层协议,这时TCP数据段被封装在IP数据包内。TCP数据段由TCP Header(头部)和TCP Data(数据)组成。TCP最多可以有60个字节的头部,如果没有Option字段,正常的长度是20字节。
- 源端口(Source Port)(16位):
- 源主机的应用程序使用的端口号
- 目的端口(Destination Port)(16位):
- 目的主机的应用程序使用的端口号。每个TCP头部都包含源和目的端的端口号,这两个值加上IP头部中的源IP地址和目的IP地址可以唯一确定一个TCP连接。
- 发送顺序号(Sequence Number)(32位):
- 本端中第一个数据字节的顺序号,4Byte,序列号,在TCP传送的数据流中,每一个字节都有一个序号,每发送一次数据包都会携带一个序列号。
- 用于标识从发送端发出的不同的TCP数据段的序号。数据段在网络中传输时,它们的顺序可能会发生变化,接收端依据此序列号,便可按照正确的顺序重组数据。
- 确认顺序号(Acknowledge Number)(32位):
- 4Byte,确认序列号,如果收到对端的一个数据包,会查看包中的序列号,并将序列号+对端ACK值的总和作为确认序列号返回给对端,表示此序列号的数据包已经收到,并期待收到下一个标识数据包的序列号是多少
- 头部长度(Header Length)(4位):
- 传输头中32位字的个数。因为传输头有任选部分,长度不固定,所以需要
- 保留字段(Resy)(6位):
- 未用,所以实现必须把这个字段置全0
- 标志字段(6位):表示各种控制信息。
- 窗口(windows)(16位):
- 2Byte,滑动窗口大小,,默示报文段发送方的接管窗口,单位为字节。此窗口告诉对方,“在未收到我的确认时,你可以或许发送的数据的字节数至多此窗口的大小。”
- 校验和(Checksum)(16位):
- 段中所以16位字按模2的16次方-1相加的和,然后取1的补码
- 紧急指针(Urgent Pointer)(16位):
- 从发送顺序号开始的偏置位,指向字节流中的一个位置,此位置之前的数据时紧急数据。
- 紧急指针,当URG=1时,注解此报文应尽快传送,而不要按本来的列队次序来传送。与“URG”字段共同应用,紧急指针指出在本报文段中的紧急数据的最后一个字节的序号,使接管方可以知道紧急数据共有多长
- 任选项(Options)(长度可变):
- 选项值,那些需要使用同步动作的程式如Telnet要处理好终端的交互模式就会使用到option来指定资料封包的大小因为telnet使用的资料封包都很少但又需要即时回应。Option的长度为0,或32bit的整倍数,如果不足则填充到满
- 补丁:
- 补齐32位字边界。
唯一的确定一股流量,是通过五元组来确定,五元组包括源目IP,源目端口,和协议。
URG: 标识紧急指针是否有效
- 紧急比特URG,当URG=1时,注解此报文应尽快传送,而不要按本来的列队次序来传送。与“紧急指针”字段共同应用,紧急指针指出在本报文段中的紧急数据的最后一个字节的序号,使接管方可以知道紧急数据共有多长
- ACK: 标识确认序号是否有效
- 确认比特ACK,默认为0,如果ACK=1时,确认序列号有效位,表明该数据包包含确认信息
- PSH: 用来提示接收端应用程序立刻将数据从tcp缓冲区读走
- 急迫比特PSH,默认为0,当PSH=1时,表示通知接收端立即将数据提交给用户进程,不要在缓存中停留,等待更多的数据
- RST: 要求重新建立连接. 我们把含有RST标识的报文称为复位报文段
- 复位比特RST,默认为0,当RST=1时,注解呈现严重错误,必须开释连接,然后再重建传输连接。
- SYN: 请求建立连接. 我们把含有SYN标识的报文称为同步报文段
- 同步比特SYN, 当为1时,表示对端请求建立连接,TCP三次握手第一次时SYN为1
- FIN: 通知对端, 本端即将关闭. 我们把含有FIN标识的报文称为结束报文段
- 终止比特FIN,为1时,表示数据发送完毕,请求断开连接
2.4 TCP顺序号和确认号
- 使用序列号对数据包进行标记,以便TCP接收服务在向目的的应用传递数据之前修正错序的数据包排序。
- TCP使用确认,验证和定时器系统提供可靠性。当接收者按照顺序识别出数据包未能到达或发生错误时,接收者将通知发送者,或者接收者在特定时间内没有发送确认信息,那么发送者认为在发送结束后数据包没有到达接收方。在这两种情况下,发送者都会考虑重传数据包。
- 发送端首次发送数据包,Seq序列号为一个随机生成数值,ACK为1(首次发送)
- 接收端接收到数据包,并希望得到下一个数据包(Seq+1),此时数据包中的的Seq为1用于确认收到发送端ACK为1的数据包,并将本端发送包的中ACK置为Seq+1,表示期待接收到下个数据包的序列号
- 发送端收到接收端的TCP确认包好,查看包中的ACK为11,表示下个包的序列号,此时发送下一个包,并将ACK变为2,表示第二次发送。
2.5 TCP建立连接的过程
示例一
TCP是一种可靠的,面向连接的全双工传输层协议。
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报文段的确认。
示例二
- 主机A想要访问服务器A,发送SYN数据报文:
- SYN位置为1
- Sequence Number为100
- 服务器A收到主机发送的SYN报文后,回复ACK确认报文:
- SYN位置为1,ACK位置为1
- Acknowledge Number为100+1
- Sequence Number为300
- 主机A收到回复后,发送ACK报文确认:
- ACK位置为1
- Acknowledge Number为300+1
- Sequence Number为100+1
2.6 TCP传输过程
TCP的可靠传输还体现在TCP使用了确认技术来确保目的设备收到了从源设备发来的数据,并且是准确无误的。
确认技术的工作原理如下:
- 目的设备接收到源设备发送的数据段时,会向源端发送确认报文,源设备收到确认报文后,继续发送数据段,如此重复。
- 如图所示,主机A向服务器A发送TCP数据段,为描述方便假定每个数据段的长度都是500个字节。当服务器A成功收到序列号是M+1499的字节以及之前的所有字节时,会以序列号M+1499+1=M+1500进行确认。另外,由于数据段N+3传输失败,所以服务器A未能收到序列号为M+1500的字节,因此服务器A还会再次以序列号M+1500进行确认。
2.7 TCP流控机制——滑动窗口
- TCP滑动窗口技术通过动态改变窗口大小来实现对端到端设备之间的数据传输进行流量控制。
- TCP使用窗口机制调整数据包的流量,窗口机制可以减少因接收方缓冲区满而造成丢失数据包的可能性。
滑动窗口,在TCP建立之后传输数据时,用于管理数据流控的标识符。接收端在接收数据时会建立一个缓存区,并将缓冲区的大小标识符值放于TCP头部的Window中,表示接收端目前缓存区可以接收的最大数据位多少。滑动窗口的作用用于接收端告诉发送端自己可以一次性接收的数据大小为多少。
如图所示,主机A和服务器A之间通过滑动窗口来实现流量控制,为方便理解,此例中只考虑主机A发送数据给服务器A时,服务器A通过滑动窗口进行的流量控制。
- 主机A向服务器发送4个长度为1024字节的数据段,其中主机的窗口大小为4096个字节。服务器A收到第3个数据段后,缓存区满,第4个数据段被丢弃。服务器以ACK 3073响应,窗口大小调整为3072,表明服务器的缓冲区只能处理3072个字节的数据段。于是主机A改变其发送速率,发送窗口大小为3072的数据段。
- 主机A向主机B发起连接,传输数据给主机B
- 主机B回复ACK信息,同时携带窗口大小为3
- 主机A收到ACK确认信息后,发现窗口大小为3,于是连续发送窗口大小为3的容量的数据包给主机B
- 主机B收到数据包后,内存满,此时读取一个数据包,内存剩余为1,此时发送ACK确认,窗口大小为1
- 主机A收到后,发送窗口大小为1的数据包给主机B
2.8 TCP关闭连接
TCP支持全双工模式传输数据,这意味着同一时刻两个方向都可以进行数据的传输。在传输数据之前,TCP通过三次握手建立的实际上是两个方向的连接,因此在传输完毕后,两个方向的连接都必须要关闭。
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报文的确认
以上四次交互便完成了两个方向连接的关闭
- 主机A传输完数据,想要断开与服务器A的连接,会发送一个FIN,ACK报文:
- FIN位置为1,ACK位置为1
- Sequence umber为101
- Acknowledge Number为301(为前期主机A发送的实际数据Sequence Number传输得到数值+1)
- 注:此处的ACK置位表示前期实际的数据已经接收到
- 服务器A收到主机A发送的FIN数据包,回复ACK报文:
- ACK位置为1
- Acknowledge Number为101+1
- Sequence Number为301
- 如果服务器A也传输完数据,会发送一个FIN,ACK报文:
- FIN位置为1,ACK位置为1
- Sequence Number为301
- Acknowledge Number为101+1
- 主机A收到服务器A的FIN数据包,发送ACK确认报文,seq为a+1,ack为b+1,(表示已收到服务器A的FIN序列号为b的数据包)
2.9 相关问题
注**1**:为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以TCP传输是一种全双工的模式,两端的传输都是相互分开的,TCP断开也是相互独立的,它这里的ACK报文和FIN报文多数情况下都是分开发送的。
注**2:为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED**状态?
这是因为虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。
三、UDP
3.1 UDP介绍
- UDP是User Datagram Protocol的简称,中文名是用户数据报协议,是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,UDP在IP报文的协议号是17。
- UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠性较差,当应用程序对传输的可靠性要求不高,但是对传输速度和延迟要求较高时,可以用UDP协议来替代TCP协议在传输层控制数据的转发。
- UDP将数据从源端发送到目的端时,无需事先建立连接。UDP采用了简单、易操作的机制在应用程序间传输数据,没有使用TCP中的确认技术或滑动窗口机制,因此UDP不能保证数据传输的可靠性,也无法避免接收到重复数据的情况。
3.2 UDP头部
UDP报文分为UDP报文头和UDP数据区域两部分。报头由源端口、目的端口、报文长度以及校验和组成。UDP适合于实时数据传输,如语音和视频通信。相比于TCP,UDP的传输效率更高、开销更小,但是无法保证数据传输的可靠性。UDP头部的标识如下:
- Source Port(源端口号):访问服务源端口号
- Destination Port(目的端口号):访问服务目的端口号
- Length(长度):是指UDP头部和UDP数据的字节长度,因为UDP头部长度为8字节所以该字段的最小值为8
- Checksum(校验和):校验和信息
3.3 UDP传输过程
主机A发送数据包时,这些数据包是以有序的方式发送到网络中的,每个数据包独立地在网络中被发送,所以不同的数据包可能会通过不同的网络路径到达主机B。这样的情况下,先发送的数据包不一定先到达主机B。因为UDP数据包没有序号,主机B将无法通过UDP协议将数据包按照原来的顺序重新组合,所以此时需要应用程序提供报文的到达确认、排序和流量控制等功能。通常情况下,UDP采用实时传输机制和时间戳来传输语音和视频数据