运输层 | Personal Blog

运输层

协议概述

端口

运输层使用协议端口号(端口)区分不同主机的不同进程;不同的主机上同一个端口号所表示的进程没有关联

运输层的抽象协议端口是软件端口,是应用层的各种不同协议进程与运输实体进行交互的地址

UDP

概述

  • UDP是无连接的,无论是发送数据之前或是结束

  • 尽最大努力交付

  • UDP面向报文:即只在交付的报文前加上UDP首部

  • 没有拥塞控制:即允许丢失一些数据,不允许太大的时延

首部格式

  • 源端口: 指定是否需要对方回信

  • 目的端口: 终点交付报文

  • 长度: UDP数据报的长度

  • 检验和: 检测传输的数据是否出错

TCP

  • TCP是面向连接的运输层协议,通信前须建立连接,结束后释放

  • TCP连接是点对点的连接

  • TCP是可靠交付的服务

  • 面向字节流:指每次TCP传输并不一定是完整的

TCP的连接

  • 套接字:端口号和IP地址拼接而成,是TCP连接的端点

每条TCP连接唯一地被通信两端的两个端点(即两个套接字)所确定

可靠传输的工作原理

停止等待协议

即每次发送方发送一个分组后等待对方的响应,再发送下一个分组

若接收方接收到有差错的分组,则丢弃,一段时间后发送方没有收到响应,则重发该组

若接收方的响应丢失,则接收方须在发送方重传后再次发送响应

连续ARQ协议

发送方将连续N个分组连续发出,然后等待接收方的响应,当接收方确认前S个分组都接收到了,发送方就继续发送

TCP报文首部

16位端口号:标示该段报文来自哪里(源端口)以及要传给哪个上层协议或应用程序(目的端口)。进行tcp通信时,一般client是通过系统自动选择的临时端口号,而服务器一般是使用知名服务端口号或者自己指定的端口号。

32位序号:表示本报文段的第一个数据字节在整个字节流中的位置序号

32位确认号:用作对另一方发送的tcp报文段的响应。其值是收到对方的tcp报文段的序号值+1,即期待下一个发送的报文序列号。假定主机A和B进行tcp通信,那么A发出的tcp报文段不但带有自己的序号,也包含了对B发送来的tcp报文段的确认号。反之也一样。

4位头部长度:表示tcp头部有多少个32bit字(4字节),因为4位最大值是15,所以最多有15个32bit,也就是60个字节是最大的tcp头部长度。

6位标志位: URG:紧急指针是否有效,置一代表有效,有紧急数据,优先级高 ACK:表示确认号是否有效,携带ack标志的报文段也称确认报文段 PSH:提示接收端应用程序应该立即从tcp接受缓冲区中读走数据,为后续接收的数据让出空间 RST:表示要求对方重建连接。带RST标志的tcp报文段也叫复位报文段 SYN:表示建立一个连接,携带SYN的tcp报文段为同步报文段 FIN标志:表示告知对方本端要关闭连接了。

16为窗口大小:是TCP流量控制的一个手段,这里说的窗口是指接收通告窗口,它告诉对方本端的tcp接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。

16为校验和:由发送端填充,接收端对tcp报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏。注意这个校验不仅包括tcp头部,也包括数据部分。这也是tcp可靠传输的一个重要保障。

16位紧急指针:是一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一字节的序号。因此这个字段是紧急指针相对当前序号的偏移量。不妨称之为紧急偏移,发送紧急数据时会用到这个。

TCP头部选项:最后一个选项字段是可变长的可选信息,最多包含40字节的数据。

TCP实现可靠传输

以字节为单位的滑动窗口

发送端和接收端都有一个滑动窗口,发送窗口必须不超过接收窗口的数值

发送窗口的状态由3个指针描述,将信息分割为:

  1. 已发送,收到确认

  2. 已发送,未收到确认

  3. 允许发送,未发送

  4. 不允许发送

拥塞控制

慢开始

  • 拥塞窗口:反映网络拥塞程度的窗台变量

当主机不知道网络的拥塞情况时,须由小到大逐渐增大发送窗口,以免发送过多数据导致网络发生拥塞

接收方每收到一个新报文时,可以增大拥塞窗口
增加的数量为min(N,SMSS)
逐步增大拥塞窗口,以便发射更多的报文,增大网络的利用效率

拥塞避免

当拥塞窗口达到一定值(ssthresh)时,每经过一个往返时间,拥塞窗口+1

当网络出现超时,则将拥塞窗口置1,ssthresh减半,重新开始传输

快重传

有时某些报文会在网络中丢失,此时发送方会判断为超时,于是将拥塞窗口置1,但实际网络并未拥塞

当接收方发现有丢失的报文,就在每次收到失序的报文时发送对最后一个顺序报文的确认;当发送方收到连续三个重复确认时,立即对丢失的报文进行重传

快恢复

发送方发现网络并未拥塞,于是不启动慢开始,而是执行快恢复算法:拥塞窗口减半,调整ssthresh为拥塞窗口值,执行拥塞避免

主动队列管理

当路由器中等待分发的数据占满了队列,路由器将对新的数据报进行丢弃;当一定数量的路由器同时受到尾部数据丢弃的影响时,整个网络将在很短的时间内进入慢开始状态

于是路由器需要在队列未满,而只是到达一个危险值时,即将队尾的数据报丢弃,这样就使得发送方的数据发送频率有所降低,网络拥塞程度也会有所降低

TCP运输连接管理

三次握手

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers),表示建立连接。即主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;即主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手,表示响应。即主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。

四次挥手

第一次挥手:首先客户端想要释放连接,向服务器端发送一段TCP报文,其中:

标记位为FIN,表示“请求释放连接“; 序号为Seq=U; 随后客户端进入FIN-WAIT-1阶段,即半关闭阶段。并且停止在客户端到服务器端方向上发送数据,但是客户端仍然能接收从服务器端传输过来的数据。 注意:这里不发送的是正常连接时传输的数据(非确认报文),而不是一切数据,所以客户端仍然能发送ACK确认报文。

第二次挥手:服务器端接收到从客户端发出的TCP报文之后,确认了客户端想要释放连接,随后服务器端结束ESTABLISHED阶段,进入CLOSE-WAIT阶段(半关闭状态)并返回一段TCP报文,其中:

标记位为ACK,表示“接收到客户端发送的释放连接的请求”; 序号为Seq=V; 确认号为Ack=U+1,表示是在收到客户端报文的基础上,将其序号Seq值加1作为本段报文确认号Ack的值; 随后服务器端开始准备释放服务器端到客户端方向上的连接。 客户端收到从服务器端发出的TCP报文之后,确认了服务器收到了客户端发出的释放连接请求,随后客户端结束FIN-WAIT-1阶段,进入FIN-WAIT-2阶段

前”两次挥手”既让服务器端知道了客户端想要释放连接,也让客户端知道了服务器端了解了自己想要释放连接的请求。于是,可以确认关闭客户端到服务器端方向上的连接了

第三次挥手: 服务器端自从发出ACK确认报文之后,经过CLOSED-WAIT阶段,做好了释放服务器端到客户端方向上的连接准备,再次向客户端发出一段TCP报文,其中:

标记位为FIN,ACK,表示“已经准备好释放连接了”。注意:这里的ACK并不是确认收到服务器端报文的确认报文。 序号为Seq=W; 确认号为Ack=U+1;表示是在收到客户端报文的基础上,将其序号Seq值加1作为本段报文确认号Ack的值。 随后服务器端结束CLOSE-WAIT阶段,进入LAST-ACK阶段。并且停止在服务器端到客户端的方向上发送数据,但是服务器端仍然能够接收从客户端传输过来的数据。

第四次挥手: 客户端收到从服务器端发出的TCP报文,确认了服务器端已做好释放连接的准备,结束FIN-WAIT-2阶段,进入TIME-WAIT阶段,并向服务器端发送一段报文,其中:

标记位为ACK,表示“接收到服务器准备好释放连接的信号”。 序号为Seq=U+1;表示是在收到了服务器端报文的基础上,将其确认号Ack值作为本段报文序号的值。 确认号为Ack=W+1;表示是在收到了服务器端报文的基础上,将其序号Seq值作为本段报文确认号的值。 随后客户端开始在TIME-WAIT阶段等待2MSL后,若对方没有重传FIN-ACK报文,则进入CLOSED状态

本文共4061字符