计算机网络 - 传输层

​ ​ ​ ​ ​ 这篇博客主要基于大三上学期复习期末考试时整理的文档,教学用书为谢希仁教授的《计算机网络(第七版)》,文档内容主要参考课本,其余参考的书籍、博客、视频都在文末列出。


​ ​ ​ ​ 网络层只把分组发送到目的主机,但是真正通信的并不是主机而是主机中的进程。传输层提供了进程间的逻辑通信,传输层向高层用户屏蔽了下面网络层的核心细节,使应用程序看起来像是在两个传输层实体之间有一条端到端的逻辑通信信道。

​ ​ ​ ​ 运输层有一个很重要的功能—分用和复用。复用指的是发送发不同的应用进程都可以使用同一个运输层协议传送数据,分用指的是接收方的运输层在去掉报文的首部后能够把这些数据正确交付目的应用进程。

​ ​ ​ ​ 运输层对收到的报文进行差错检验。在网络层IP数据报首部中的检验和字段,只检验首部是否出现差错而不检验数据部分。

一、运输层的两个主要协议

​ ​ ​ ​ TCP/IP运输层的两个主要协议是用户数据报协议UDP和传输控制协议TCP。

  • 两个对等运输实体在通信时传送的数据单位是运输协议数据单元TPDU,但在TCP/IP体系中,根据所使用的协议为TCP或者UDP,分别称之为TCP报文段或者是UDP用户数据报。

  • UDP在发送数据之前不需要建立连接,远地主机的运输层在收到UDP报文后,不需要给出任何确认。TCP提供面向连接的服务,在传输数据之前必须先建立连接,数据传送结束后要释放连接。TCP不提供多播或广播服务。

​ ​ ​ ​ ​ 使用UDP和TCP协议的各种应用和应用层协议。

应用应用层协议运输层协议端口
名字转换DNSUDP53
文件传送TFTPUDP69
路由选择协议RIPUDP
网络管理SNMPUDP161
多播IGMPUDP
电子邮件SMTPTCP25
远程终端接入TELNETTCP23
万维网HTTPTCP80
文件传送FTPTCP21
HTTPS443

二、用户数据报协议UDP

​ ​ ​ ​ UDP是无连接的,因此减少了开销和发送数据之前的时延;UDP使用尽最大努力交付,即不保证可靠交付;UDP 是面向报文的;UDP没有拥塞控制;UDP支持一对一、一对多、多对一和多对多的交互通信;UDP的首部开销小。

UDP首部格式


​​ ​ ​ ​ 首部字段只有 8 个字节,包括源端口、目的端口、长度、检验和。12 字节的伪首部是为了计算检验和临时添加的。

​ ​ ​ ​ UDP检验和覆盖UDP首部和UDP数据,IP首部的检验和只覆盖IP首部,并不覆盖IP数据包中的任何数据,不过UDP检验和是可以选择的,相比于UDP来说TCP的检验和是必须存在的。

​ ​ ​ ​ IP数据包的最大长度是65535字节,UDP数据包中用户数据的最长长度为65507字节,但是由于应用程序可能受到程序接口的限制以及TCP/IP的内核实现限制,IP数据报长度可能小于65535字节。主机必须能接收最短为576字节的IP数据报,许多UDP应用程序的设计里,数据被限制成512字节或者说更小,所以例如DNS、TFTP、SNMP这样的协议总是发送数据报小于512字节的数据。

三、传输控制协议TCP

​ ​ ​ ​ TCP是面向连接的运输层协议;每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点;TCP提供可靠交付的服务,通过TCP连接传送的数据,无差错、不丢失也不重复并且按照次序到达;TCP提供全双工通信;面向字节流。

​ ​ ​ ​ TCP连接的两个端点是套接字,端口号拼接到IP地址就组成了套接字。下面来看看TCP首部格式。


  • 序号 :用于对字节流进行编号,例如序号为 301,表示第一个字节的编号为 301,如果携带的数据长度为 100 字节,那么下一个报文段的序号应为 401。

  • 确认号 :期望收到的下一个报文段的序号。例如 B 正确收到 A 发送来的一个报文段,序号为 501,携带的数据长度为 200 字节,因此 B 期望下一个报文段的序号为 701,B 发送给 A 的确认报文段中确认号就为 701。

  • 数据偏移 :指的是数据部分距离报文段起始处的偏移量,实际上指的是首部的长度。

  • 确认 ACK :当 ACK=1 时确认号字段有效,否则无效。TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 置 1。

  • 同步 SYN :在连接建立时用来同步序号。当 SYN=1,ACK=0 时表示这是一个连接请求报文段。若对方同意建立连接,则响应报文中 SYN=1,ACK=1。

  • 终止 FIN :用来释放一个连接,当 FIN=1 时,表示此报文段的发送方的数据已发送完毕,并要求释放连接。

  • 窗口 :窗口值作为接收方让发送方设置其发送窗口的依据。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。

四、TCP 的三次握手


​ ​ ​ ​ 假设 A 为客户端,B 为服务器端。

  • 首先 B 处于 LISTEN(监听)状态,等待客户的连接请求。

  • A 向 B 发送连接请求报文,SYN=1,ACK=0,选择一个初始的序号 x。

  • B 收到连接请求报文,如果同意建立连接,则向 A 发送连接确认报文,SYN=1,ACK=1,确认号为 x+1,同时也选择一个初始的序号 y。

  • A 收到 B 的连接确认报文后,还要向 B 发出确认,确认号为 y+1,序号为 x+1。

  • B 收到 A 的确认后,连接建立。

三次握手的原因

​ ​ ​ ​ 第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接。

​ ​ ​ ​ 客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间才能收到服务器端发回的连接确认。客户端等待一个超时重传时间之后,就会重新请求连接。但是这个滞留的连接请求最后还是会到达服务器,如果不进行三次握手,那么服务器就会打开两个连接。如果有第三次握手,客户端会忽略服务器之后发送的对滞留连接请求的连接确认,不进行第三次握手,因此就不会再次打开连接。

五、TCP 的四次挥手


​ ​ ​ ​ 以下描述不讨论序号和确认号,因为序号和确认号的规则比较简单。并且不讨论 ACK,因为 ACK 在连接建立之后都为 1。

  • A 发送连接释放报文,FIN=1。

  • B 收到之后发出确认,此时 TCP 属于半关闭状态,B 能向 A 发送数据但是 A 不能向 B 发送数据。

  • 当 B 不再需要连接时,发送连接释放报文,FIN=1。

  • A 收到后发出确认,进入 TIME-WAIT 状态,等待 2 MSL(最大报文存活时间)后释放连接。

  • B 收到 A 的确认后释放连接。

四次挥手的原因

​ ​ ​ ​ 客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送 FIN 连接释放报文。

TIME_WAIT

​ ​ ​ ​ 客户端接收到服务器端的 FIN 报文后进入此状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间 2MSL。这么做有两个理由:

  • 确保最后一个确认报文能够到达。如果 B 没收到 A 发送来的确认报文,那么就会重新发送连接释放请求报文,A 等待一段时间就是为了处理这种情况的发生。

  • 等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文。

六、TCP 可靠传输

​ ​ ​ ​ TCP发送的报文段是交给IP层传送的,但是IP层只能尽最大努力服务,也就是说TCP下面的网络提供的是不可靠传输。因此,TCP必须采用适当的措施才能让两个运输层之间的通信变得可靠。可靠传输的工作原理基于停止等待协议和联系ARQ协议。

停止等待协议

  • 出现差错:接受方丢弃有差错的报文或者接受方没有收到报文的情况下,无法向发送方发送任何信息,在这种情况下,发送方超过一段时间仍然没有收到确认,就认为刚才发送的分组丢失,然后重传前面发送过的分组,这就是超时重传。

    超时计时器:每发送完一个分组时设置一个超时计时器,如果在超时计时器到期之前收到了对方的确认那就撤销已经设置的超时计时器。

  • 确认丢失和确认迟到:接受方收到了发送方发来的数据,也发送了对数据包的确认,但是在超时计时器设置的时间里没有收到确认那么这个发送发就得重传,此时接受方会再一次收到一毛一样的数据,接受方会丢弃这个重复分组然后向发送方发送确认。如果发送方收到了重复的确认,那么收下迟到的确认然后啥也不做。

🌈 注意

1.发送方发送完了一个分组以后,必须暂时保留已发送分组的副本,超时重传的时候使用,只有收到了对应的确认之后才能清除对应副本.

2.分组和确认分组都必须有编号,这样可以明确是哪个发出去的分组收到了确认,哪一个分组每收到确认.

3.超时重传的时间设定:

​ ​ ​ ​ TCP 使用超时重传来实现可靠传输:如果一个已经发送的报文段在超时时间内没有收到确认,那么就重传这个报文段。

​ ​ ​ ​ 一个报文段从发送再到接收到确认所经过的时间称为往返时间 RTT,加权平均往返时间 RTTs 计算如下:


​ ​ ​ ​ 其中,0 ≤ a < 1,RTTs 随着 a 的增加更容易受到 RTT 的影响。

​ ​ ​ ​ 超时时间 RTO 应该略大于 RTTs,TCP 使用的超时时间计算如下:


​ ​ ​ ​ 其中 RTTd 为偏差的加权平均值。

连续ARQ协议

1.发送方维持的发送窗口:位于发送方窗口的几个分组都可以连续的发出去,而不需要等待对方的确认。

2.连续ARQ协议规定,发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。

3.接收方一般都才有累计确认的方式。对按序到达的最后一个分组发送确认。这就表示到这个分组为止的所有分组都已经正确的收到了。

4.这个连续ARQ协议又叫做Go-back-N协议。如果发送方发送了前五个分组,而中间第三个丢了,那么接收方只对前两个发出确认,那么发送方就得重传后面的三个。

七、TCP 滑动窗口

​ ​ ​ ​ 窗口是缓存的一部分,用来暂时存放字节流。发送方和接收方各有一个窗口,接收方通过 TCP 报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和其它信息设置自己的窗口大小。

​ ​ ​ ​ 发送窗口内的字节都允许被发送,接收窗口内的字节都允许被接收。如果发送窗口左部的字节已经发送并且收到了确认,那么就将发送窗口向右滑动一定距离,直到左部第一个字节不是已发送并且已确认的状态;接收窗口的滑动类似,接收窗口左部字节已经发送确认并交付主机,就向右滑动接收窗口。

​ ​ ​ ​ 接收窗口只会对窗口内最后一个按序到达的字节进行确认,例如接收窗口已经收到的字节为 {31, 34, 35},其中 {31} 按序到达,而 {34, 35} 就不是,因此只对字节 31 进行确认。发送方得到一个字节的确认之后,就知道这个字节之前的所有字节都已经被接收。


🎈发送缓存

​ ​ ​ ​ 发送缓存用来暂时存放发送应用程序传送给发送方TCP准备发送的数据和TCP已发送但是没收到确认的数据。

🎨接收缓存

​ ​ ​ ​ 接收缓存用来暂时存放按序到达但没有被应用程序读取的数据和未按序到达的数据。对于不按序到达的数据先临时存放在接收窗口中等到字节流中所缺少的字节到了之后再按序交付给上层的应用进程。

八、TCP 流量控制

​ ​ ​ ​ 流量控制是基于滑动窗口实现的,流量控制是为了控制发送方发送速率,保证接收方来得及接收。

​ ​ ​ ​ 接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。

​ ​ ​ ​ 这种暂停发送的状态会持续到接受方重新发出一个新的窗口值为止,如果接受方给发送方发送了零窗口的报文段不久,接受方这边的接收缓存又有了一点存储空间,比如接受方给发送发发送了 r w n d = 400 rwnd=400 rwnd=400的报文段,然而这个报文段在传送过程中丢掉了,发送方一直等待着接受方发送的非零窗口的通知,接受方也一直等待发送方发送的数据,这样一来岂不是形成了死锁的局面?

​ ​ ​ ​ 解决方法就是给每一个连接设置坚持定时器。只要TCP连接的一方收到对方的零窗口通知,就启动这个计时器,若坚持计时器设置的时间到期了,就发送一个零窗口探测报文段,而对方就在确认这个探测报文段的时候给出现在的窗口值,如果还是0,那么收到该报文段的一方就重新设置坚持计时器,反之如果窗口值不是0那么问题就解决了。

九、TCP 拥塞控制

​ ​ ​ ​ 如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制发送方的速率。这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度。


​ ​ ​ ​ TCP 主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复。

​ ​ ​ ​ 发送方需要维护一个叫做拥塞窗口( c w n d cwnd cwnd)的状态变量,注意拥塞窗口与发送方窗口的区别:拥塞窗口只是一个状态变量,实际决定发送方能发送多少数据的是发送方窗口。

​ ​ ​ ​ 为了便于讨论,做如下假设:

  • 接收方有足够大的接收缓存,因此不会发生流量控制;
  • 虽然 TCP 的窗口基于字节,但是这里设窗口的大小单位为报文段。

1. 慢开始与拥塞避免

​ ​ ​ ​ 发送的最初执行慢开始,令 c w n d cwnd cwnd = 1,发送方只能发送 1 个报文段;当收到确认后,将 c w n d cwnd cwnd加倍,因此之后发送方能够发送的报文段数量为:2、4、8 …

​ ​ ​ ​ 注意到慢开始每个轮次都将 c w n d cwnd cwnd加倍,这样会让 c w n d cwnd cwnd增长速度非常快,从而使得发送方发送的速度增长速度过快,网络拥塞的可能性也就更高。设置一个慢开始门限 s s t h r e s h ssthresh ssthresh,当 c w n d cwnd cwnd>= s s t h r e s h ssthresh ssthresh 时,进入拥塞避免,每个轮次只将 c w n d cwnd cwnd加 1。

​ ​ ​ ​ 如果出现了网络拥塞(表现是超时),则令 s s t h r e s h ssthresh ssthresh = c w n d cwnd cwnd/ 2,然后重新执行慢开始。

名词解释

1.传输轮次:一个传输轮次所经历的时间就是往返时间RTT,拥塞窗口 c w n d cwnd cwnd的大小是4个报文段,那么这时候往返时间RTT就是发送方连续发送4个报文段,并且收到4个报文段的确认,总共经历的时间。

2.慢开始:慢开始的慢不是指 c w n d cwnd cwnd增长速度慢,实际上以指数级增长已经很快了,这个慢指的是发送方在开始时只发送1个报文段,然后逐渐增大。

3. s s t h r e s h ssthresh ssthresh:慢开始门限, s s t h r e s h = m a x [ l i g h t / 2 , 2 ∗ S M S S ] ssthresh=max[light/2,2*SMSS] ssthresh=max[light/2,2SMSS] S M S S SMSS SMSS指的是发送方最大报文段, F l i g h t S i z e FlightSize FlightSize指的是正在网络中传送的数据量。所以说初始时 s s t h r e s h = 2 ∗ S M S S ssthresh=2*SMSS ssthresh=2SMSS

2. 快重传与快恢复

​ ​ ​ ​ 在接收方,要求每次接收到报文段都应该对最后一个已收到的有序报文段进行确认。例如已经接收到 M1 和 M2,此时收到 M4,应当发送对 M2 的确认。

​ ​ ​ ​ 在发送方,如果收到三个重复确认,那么可以知道下一个报文段丢失,此时执行快重传,立即重传下一个报文段。例如收到三个 M2,则 M3 丢失,立即重传 M3

​ ​ ​ ​ 在这种情况下,只是丢失个别报文段,而不是网络拥塞。因此执行快恢复,令 s s t h r e s h ssthresh ssthresh= c w n d cwnd cwnd/ 2 , c w n d cwnd cwnd = s s t h r e s h ssthresh ssthresh,注意到此时直接进入拥塞避免。

​ ​ ​ ​ 慢开始和快恢复的快慢指的是 c w n d cwnd cwnd 的设定值,而不是 c w n d cwnd cwnd的增长速率。慢开始 cwnd 设定为 1,而快恢复 c w n d cwnd cwnd 设定为 s s t h r e s h ssthresh ssthresh


参考

1.《计算机网络(第7版)》
2.《TCP/IP详解,卷1:协议》
3.公众号:CyC2018
4.湖科大教书匠:《计算机网络》微课堂

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值