计算机网络篇-运输层

运输层

运输层向上层应用层提供通信服务。

运输层是端到端的通信,也就是说通信的两端是两个主机中的应用进程。

运输层还有一个很重要的功能 :分用、复用。

运输层的两个主要协议

用户数据报协议UDP :不需要建立连接

传输控制协议TCP :提供面向连接的服务

端口

前面提到的分用、复用就是利用了端口进行的。

在应用层和运输层之间设置一个抽象的门,这些门就是通信的抽像终点也被称为端口,当应用层的应用进程要通过运输层发送到互联网时,必须要通过这个门,而别的主机上的应用进程要寻找本主机中的某个应用进程也需要通过整个门。

(需要注意的是,这些协议栈之间的抽象的协议端口是软件端口,与路由器和交换机上的硬件端口是不一样的,硬件端口是不同硬件设备进行交互的接口,软件端口是应用层的各种协议进程与运输实体进行层间交互的地点。)

端口号只具有本地意义 ,也就是说它只是为了标志在本计算机应用层中的各个进程在和运输层交互时的层间接口。

用户数据报协议UDP

特点 :无连接的、不可靠交付(尽最大努力)、面向报文的、没有拥塞控制、首部开销少、支持一对一、一对多、多对一和多对多的交互通信。

功能:在IP数据报的服务之上增加了复用和分用、差错检测的功能。

UDP首部

源端口 :源端口号

目的端口 :目的端口号

长度 :UDP用户数据报的长度

检验和 :检测UDP用户数据报在传输中是否有错。

计算检验和 :在计算检验和时,会先在UDP数据报前加一个12字节的伪首部,然后将UDP的首部和数据部分都分为16个位大小的字。若数据部分不是偶数个字节,那么添加一个全零字节(但是不会发送)然后按照二进制反码求和。将得到的结果填入检验和字段。接收方把收到的UDP数据报连同伪首部(以及可能的全零填充字节)一起,按照二进制反码求和。若无差错则结果应为全1,否则出现差错就丢弃该数据报。(这里需要注意的是 IP协议在计算检验和时只检验首部,而UDP是首部和数据部分都检验。)

传输控制协议TCP

特点 :面向连接的、点对点的、可靠交付的、全双工通信的、面向字节流的。

TCP连接的端点叫做套接字

套接字 socket=(IP地址: 端口号)

每一条TCP连接唯一地被通信两端的两个端点所确定。

可靠传输的原理(确认和重传)

停止等待协议

“停止等待”就是每发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。

可能出现的情况 :

1、无差错情况 :收到确认后发送分组即可

2、出现差错情况 :超过一段时间未收到确认的话就需要进行超时重传。(超时重传的实现是在每发送完一个分组后置一个超时计时器,如果在计时器到期之前没收到确认就进行重传)

  这里就有三点需要注意:

    a. 在发送完一个分组后必须保留其副本,直到收到确认再清除。

    b. 分组和确认分组都必须进行编号。

    c. 超时计时器设置的重传时间应当比数据在分组传输的平均往返时间更长一些。

3、确认丢失和确认迟到

  如果发生确认丢失,发送方将在计时器到期后进行重传,接收方再次接收到该分组后会丢弃该分组,并且再次发送确认。如果发生确认迟到(也就是说传输没有出现差错,只是确认在计时器到期之前没有到达,但是在到期之后到达了)发送方会收到两份确认,但是发送方不对此做出反应,也就是丢弃,同样接收方也会收到两份分组,接收方会丢弃第二份分组。

连续ARQ协议

也就是连续发送多个分组,接收方采用积累确认,且只发送已接收的连续序号的最大序号的那个分组 的分组确认。(这里涉及到滑动窗口 在后续在详细解释。)

TCP报文段的首部格式

1.源端口和目的端口。

2.序号。

3.确认号 。是期望收到对方下一个报文段的第一个数据字节的序号

4.数据偏移。实际是指出TCP报文段的首部长度。

5.保留。

6紧急URG。当URG=1时,标示紧急指针字段有效,也就是尽快发送,并不按照排队顺序。并且紧急数据还将被插入在该报文段的数据最前。

7.确认ACK。仅当ACK=1时确认号有效。

8.推送PSH。

9.复位RST。当RST为1时表示连接出现严重错误,需要释放连接再次重连。

10.同步SYN。 在连接建立时用来同步序号。当SYN=1时表示该报文是一个请求连接或者连接接收报文。

11.终止FIN。用来释放一个连接。有效FIN=1.

12.窗口。发送本报文段的接收窗口(并非发送窗口),窗口值作为接收方让发送方设置其发送窗口的依据。

13.检验和。计算方式与UDP一样。

14.紧急指针。

15.选项。

TCP可靠传输的实现

以字节为单位的滑动窗口

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

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

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

超时重传时间的选择

报文段往返时间RTT,加权平均往返时间RTTs,RTT的偏差的加权平均值RTTd。其中0<α≤1,β<1 (推荐值为0.25)

超时重传时间RTO

选择确认SACK

也就是当接收窗口收到了多个不连续的字节块,但是这些字节块都在接收窗口内,那么可以将这些信息告诉发送方,让发送方只发送缺少的数据。(如果使用选择确认,需要在连接建立时双方进行商定,并加上选择确认SACK的选项)

TCP的流量控制

流量控制是为了控制发送方发送速率,保证接收方来得及接收。

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

TCP的拥塞控制

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

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

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

(如果考虑流量控制,那么发送窗口的上限值应该是接收方窗口rwnd和拥塞窗口cwnd的中的最小值)

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

  • 接收方有足够大的接收缓存,因此不会发生流量控制;

  • 虽然 TCP 的窗口基于字节,但是这里设窗口的大小单位为报文段。

1. 慢开始与拥塞避免

发送的最初执行慢开始,令 cwnd = 1,发送方只能发送 1 个报文段;在每收到一个新的报文段确认后增加一个。

注意如果连接不出现差错在慢开始,那么每个轮次都将 cwnd 加倍,这样会让 cwnd 增长速度非常快,从而使得发送方发送的速度增长速度过快,网络拥塞的可能性也就更高。设置一个慢开始门限 ssthresh,当 cwnd >= ssthresh 时,进入拥塞避免,每个轮次只将 cwnd 加 1。

如果出现了超时,则令 ssthresh = cwnd / 2,同时将cwnd设为1 然后重新执行慢开始。

2. 快重传与快恢复

在接收方,要求每次接收到报文段都应该对最后一个已收到的有序报文段进行确认,也就是说即使收到了失序的报文段,也需要立即发送对已收到的有序报文段的重复确认,并且快重传算法规定,发送认确时不能等待有数据发送时捎带,而是立即发送。例如已经接收到 M1 和 M2,此时收到 M4,应当立即发送对 M2 的确认。

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

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

慢开始和快恢复的快慢指的是 cwnd 的设定值,而不是 cwnd 的增长速率。慢开始 cwnd 设定为 1,而快恢复 cwnd 设定为 ssthresh。

TCP的运输连接管理

运输连接有三个阶段 :连接建立、数据传送、连接释放

TCP连接的建立采用的是客户服务器方式。

TCP规定SYN报文段(SYN=1的报文段)不能携带数据,但要消耗一个序号。

TCP规定ACK报文可以携带数据,但是如果不携带则不消耗序号,携带需要消耗。

TCP规定FIN报文段即使不携带数据也需要消耗掉一个序号。

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的连接释放(四报文挥手)

现在A和B都处于ESTABLISHED状态,当数据传输结束后双方都可以释放连接,又因为是全双工的通信,当双方数据传输结束后,也必须双方都释放连接。

例 :

  • 当A发送释放报文时 FIN=1 序号seq=u (u是前面已传送过的数据的最后一个字节的序号+1)

    (此时A进入FIN-WAIT-1状态),等待B的确认。

  • B收到连接释放报文段后发出确认报文 ACK=1 确认号=u+1 序号seq=v(v是B前面已经传送过的数据的最后一个字节的序号加1)

    (此时B进入CLOSE-WAIT状态,TCP连接处于半连接状态,也就是说A→B这个方向的连接断开,而B→A的连接还没断开)

  • 当A收到确认后进入FIN-WAIT-2状态。

  • 若B也没有要传送给A的数据时,其应用程序就会通知TCP释放连接,B发送释放报文 FIN=1,序号=w,确认号还是上次已发送过的u+1.

    (这时B就进入LAST-ACK状态,等待A的确认)

  • A收到B的释放报文后需要发送一个确认,ACK=1 确认号ack=w+1 序号是u+1 。

    (此时A进入TIME-WAIT状态,而不是直接进入CLOSED,等待2个MSL后进入CLOSED)

  • B收到确认 进入CLOSED

TIME_WAIT

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

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

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

四报文挥手的原因

因为TCP连接是全双工的连接,双方都可以向对方传输数据,所以在一方(A)数据发送完成,发送释放连接报文之后,另一方(B)进入CLOSE-WAIT状态。进入这个状态是为了让另一方(B)继续发送未发送完的数据,当数据也发送完成,那么也发送释放报文。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值