IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 计算机网络(谢希仁第7版)-运输层 -> 正文阅读

[网络协议]计算机网络(谢希仁第7版)-运输层

计算机网络(谢希仁第7版)- 网络层

运输层

运输层协议概述

从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最底层。

网络层为主机之间提供逻辑通信,而运输层为应用进程之间提供端到端的逻辑通信。

运输层要对收到的报文进行差错检测。

运输层的两个主要协议

1)用户数据报协议UDP(User Datagram Protocol)

  1. 传输控制协议TCP(Transmission Control Protocol)

两个对等运输实体在通信时传送的数据单位叫做运输协议数据单元TPDU(Transport Protocol Data Unit)。

TCP传送的数据单位协议是TCP报文段(segment)。全双工可靠通信

UDP传送的数据单位协议是UDP报文或用户数据报。不可靠信道。

UDP在传送数据之前不需要先建立连接,远程主机的运输层在收到UDP报文后,不需要给出任何确认。

TCP则是面向连接的服务,在传送数据之前必须先建立连接,数据传送结束后要释放连接。TCP不提供广播和多播服务。由于TCP要提供可靠的、面向连接的运输服务,因此不可避免地增加了许多开销,如确认、流量控制、计时器以及连接管理等。这不仅使协议数据单元的首部增大很多,还要占用许多的处理机资源。

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

在这里插入图片描述

运输层的端口

端口就是运输层服务访问点TSAP。

端口的作用就是让应用层的各种应用进程都能将其数据通过端口向下交付给运输层,以及让运输层知道应当将其报文段中的数据向上通过端口交付给应用层的相应的进程。从这个意义上看,端口是用来标志应用层的进程。

端口用一个16bit端口号进行标志,只具有本地意义,即只是为了标志本计算机应用层中的各进程。

运输层端口分为两类:

1)服务端使用的端口号,这里又分为两类,最重要的一类叫做熟知端口号或系统端口号,数值为01023,另一类叫做登记端口号,数值为102449151,这类端口号是为没有熟知端口号的应用程序使用的。

在这里插入图片描述

2)客户端使用的端口号 数值为49152~65535。由于这类端口号仅在客户进程运行时才动态选择,因此又叫做短暂端口号。

插口(socket)

TCP使用连接作为最基本的抽象,同时将TCP连接的端口称为插口,或套接字、套接口。插口=IP地址:端口号。

用户数据报协议UDP

UDP概述

UDP只在IP的数据报服务上增加了复用和分用的功能以及差错检测的功能。应用层所有的应用进程都可以通过运输层再传送到IP层(网络层),这就是复用。运输层从IP层收到发送给各应用进程的数据后,必须分别交付指明的各应用进程,这就是分用。

UDP主要特点:

1)UDP是无连接的,即发送数据报之前不需要建立连接,因此减少了开销和发送数据之前的时延。

2)UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表。

3)UDP是面向报文的,发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。

UDP对应用层交下来的报文即不合并也不拆分,而是保留这些报文的边界。这就是说,应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。

因此应用程序必须选择合适大小的报文,若报文太长,UDP把它交给IP层后,IP层在传送时可能要进行分片,这会降低IP层的效率。反之,若报文太短,UDP把它交给IP层后,会使IP数据报的首部的相对长度太大,这也降低了IP层的效率。

4)UDP没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。

很多实时应用(如IP电话、实时视频会议等)要求源主机以恒定的速率发送数据,并其允许在网络发送拥塞时丢弃一些数据,但却不允许数据有太大的时延。UDP正好适合这种情况。

5)UDP支持一对一、一对多、多对一和多对多的交互通信。

6)UDP的首部开销小,只有8个字节,比TCP的20个字节的首部要短。

UDP的首部格式

用户数据报UDP有两个字段:数据字段和首部字段。首部字段很简单,只有8个字节,由四个字段组成,每个字段长度都是两个字节。

1)源端口 源端口号。在需要对方回信时选用,不需要时可全为0。

2)目的端口 目的端口号,这在终点交付报文时必须使用。

3)长度 UDP用户数据报的长度,最小值是8

4)检验和 检测UDP用户数据报在传输中是否有错,有错就丢失,并由网际控制报文协议ICMP发送“端口不可达”差错报文给发送方。

UDP在计算检验和时,要在UDP用户数据报之前增加12个字节的伪首部(伪首部仅在计算检验和时才临时添加),计算方法和IP数据报首部检验和的方法相似,但IP数据报的检验和只检验IP数据报的首部,但UDP的检验和是把伪首部、首部和数据部分一起都检验。在发送方,首部是先把全零放入检验和字段,再把整个数据报按16位进行划分,若数据部分不是偶数个字节,则要填入一个全零字节,然后按二进制反码计算出这些16位字的和,将此和的二进制反码写入检验和字段。

伪首部由以下几个字段组成:IP数据报的源IP地址、目的地址、第三字段为全0、IP首部的协议字段的值(UDP协议字段值为17)、用户数据报的长度。

这样的检验和既检查了UDP用户数据报的源端口号和目的端口号以及UDP用户数据报的数据部分,又检查了IP数据报的源IP地址和目的地址。

传输控制协议TCP

TCP最主要的特点

1)TCP是面向连接的运输层协议。应用程序在使用TCP协议之前,必须先建立TCP连接,在传送数据完毕后,必须释放已建立的TCP连接。

2)每一条TCP连接只能有两个端点。每一条TCP连接只能是点对点的(一对一的)。

3)TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复,并且按序到达。

4)TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。在发送时,应用程序在把数据传送给TCP的缓存后,就可以做自己的事,而TCP在合适的时候把数据发送出去。在接收时,TCP把收到的数据放入缓存,上层的应用进程在合适的时候读取缓存中的数据。

5)面向字节流。TCP中的流(stream)指的是流入到进程或从进程流出的字节序列。应用程序和TCP的交互式一次一个数据块,TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。

TCP连接是一条虚连接(也就是逻辑连接),而不是一条真正的物理连接。TCP报文段先要传送到IP层,加上IP首部后,再传送到数据链路层,再加上数据链路层的首部和尾部后,才离开主机发送到物理链路。

TCP并不关心应用进程一次把多长的报文发送到TCP的缓存中,而是根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节。

可靠传输的工作原理

停止等待协议

停止等待就是每发送完一个传送的数据单元及分组就停止发送,等待对方的确认,在收到确认后再发送下一个分组。

三种情况:

1、无差错情况,收到确认后发送下一组。

2、出现差错

分组在传输过程中出现差错的情况,接收方检测出了差错,就丢弃,其他什么也不做。或者分组在传输过程中丢失了。这两种情况下,发送方只要超过了一段时间仍然没有收到确认,就认为刚才发送的分组丢失了,因而重传前面发送过的分组,这就叫做超时重传

三个注意事项:

第一:发送方在发送完一个分组后,必须暂时保留已发送的分组的副本,只有在收到相应的确认后才能清除暂时保留的副本。

第二:分组和确认分组都必须进行编号。

第三:超时计时器设置的重传时间应当比数据在分组传输的平均时间更长一些。

3、确认丢失和确认迟到

发送方在超时时间内未收到确认,就要重传。接收方收到重传的分组后,丢弃这个重复的分组,并向发送方发送确认。

TCP报文段的首部格式

TCP报文段首部的前20个字节是固定的,后面有4n字节是根据需要增加的选项。

在这里插入图片描述

首部固定部分各字段的意义:

1)源端口和目的端口,各占2个字节。

2)序号。 占4字节,范围是[0, 232 -1]。TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,整个要传送的字节流的起始序号必须在连接建立时设置。首部中的序号字段值则指的是本报文段所发送的数据的第一个字节在所有字节流中的序号。

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

4)数据偏移。占4位,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。及TCP报文段的首部长度。单位是32位字,及4字节长,4位二进制数最大值是15,因此数据偏移的最大值是60字节。

5)保留。占6位

6)紧急URG 当URG置1时,发送应用进程就告诉发送方的TCP有紧急数据要传送,于是发送方TCP就把紧急数据插入到本报文段数据的最前面,这时要与首部中紧急指针字段配合使用。

7)确认ACK(ACKnowledgement) 仅当ACK=1时确认号字段才有效,TCP规定,在连接建立后所有传送到报文段都必须把ACK置1。

8)推送PSH,当两个应用进程进行交互式通信时,一端的应用进程希望在键入一个命令后立即就能收到对方的响应时设置为1即可。

9)复位RST(ReSet)当RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立运输连接。还用来拒绝一个非法的报文段或拒绝打开一个连接。

10)同步SYN(SYNchronization)在连接建立时用来同步序号,当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应报文段中使用SYN=1和ACK=1。因此,SYN置为1就表示这是一个连接请求或连接接受报文。

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

12)窗口 占2字节,窗口值是[0,216-1]之间的整数。指的是发送本报文段的一方的接收窗口。窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量,以字节为单位。

13)检验和。 占2字节检验和字段检验的范围包括首部和数据两部分,和UDP用户数据报一样要在TCP报文的前面加上12字节的伪首部。

14)紧急指针。占2字节,仅在URG=1时才有意义,指出本报文段中的紧急数据的末尾在报文段中的位置。

15)选项 长度可变,最长40字节。

最大报文段长度MSS选项(Maximum Segment Size):每一个TCP报文段中数据字段的最大长度,默认值是536字节。因此所有主机都应能接受的报文段长度是556字节。

窗口扩大选项,占3字节,其中有一个字节表示移位值S,新的窗口值等于TCP首部中的窗口数从16增大到16+S。移位值允许使用的最大值是14,相当于窗口最大值增大到2(16+14)-1。

时间戳选项,占10字节,其中最主要的字段是时间戳字段(4字节)和时间戳回送回答字段(4字节)。主要功能:第一,用来计算往返时间RTT。第二,用于处理TCP序号超过232的情况,这又称为防止序号绕回PAWS(Protect Against Wrapped Sequence numbers)。

TCP可靠传输的实现

TCP协议是面向字节的。TCP将所要传送的报文看成是字节组成的数据流,并使每一个字节对应一个序号。

在连接建立时,双方要商定初始序号。TCP每次发送的报文段的首部中的序号字段数值表示该报文段中的数据部分的第一个字节的序号。

TCP的确认是对接收到的数据的最高序号表示确认。接收端返回的确认号是已收到的数据的最高序号加1,因此确认号表示接收端期望下次收到的数据中的第一个数据字节的序号。

以字节为单位的滑动窗口

TCP采用大小可变的滑动窗口进行流量控制,窗口大小的单位是字节。

在TCP报文段首部的窗口字段写入的数值就是当前给对方设置的发送窗口数值的上限。

发送窗口在连接建立时由双方商定,但在通信过程中,接收端可根据字节的资源情况,随时动态地调整对方发送窗口上限值。

发送端只要收到了对方的确认,发送窗口就可前移。

发送TCP要维护一个指针,每发送一个报文段,指针就向前移动一个报文段的距离。

接收方不必对收到的分组逐个发送确认,而是在收到几个分组后,对按序到达的最后一个分组发送确认,这就表示到这个分组为止的所有分组都已正确收到了。

要描述一个发送窗口的状态需要三个指针:P1、P2和P3。

小于P1的是已发送并已收到确认的部分,而大于P3的是不允许发送的部分,P3-P1=发送端的发送窗口,P2-P1是已发送但未收到确认的字节数,P3-P2是允许发送但当前尚未发送的字节数。

发送缓存用来暂时存放的数据:1)发送应用程序传送给发送方TCP准备发送的数据。2)TCP已发送出尚未收到确认的数据。

接收缓存用来暂时存放的数据:1)按序到达的、但尚未被接收应用程序读取的数据。2)未按序到达的数据。

超时重传时间的选择

TCP记录一个报文段发出的时间及收到相应的确认的时间,这两个时间之差就是报文段的往返时间RTT。TCP保留了RTT的一个加权平均往返时间RTTs,这又称为平滑的往返时间,S表示Smoothed。每当第一次测量到RTT样本时,RTTs值就取为所测量的RTT样本值,以后每测量到一个新的RTT样本就按下式公式重新计算一次:

新的RTTs=(1- α)x(旧的RTTs)+α x (新的RTT样本)。RFC 6298推荐的α的值是1/8,即0.125。

超时计时器设置的超时重传时间RTO应略大于上面得出的加权平均往返时间RTTs,RFC 6298建议使用下式计算RTO:RTO=RTTs+4 x RTTD

RTTD是RTT的偏差的加权平均值,它与RTTs和新的RTT样本之差有关。RFC 6299建议:当第一次测量时,RTTD的值取为测量到的RTT样本值的一半,在以后的测量中,使用以下公式计算:

新的RTTD=(1-β) x (旧的RTTD) + β x |RTTs - 新的RTT样本|

β是小于1的系数,推荐值是1/4,即0.25。

当报文段每重传一次,就把超时重传时间RTO增大为旧的重传时间的2倍,当不再发生报文段的重传时才根据上式计算超时重传时间。

TCP的流量控制

所谓流量控制(flow control)就是让发送方的发送速率不要太快,要让接收方来得及接收。

发送方的发送窗口不能超过接收方给出的接收窗口的数值。

TCP为每一个连接设有一个持续计时器(persistence timer),只要TCP连接的一方收到对方的零窗口的通知,就启动持续计时器,若持续计时器设置的时间到期,就发送一个零窗口探测报文段,而对方就在确认这个探测报文段时给出了现在的窗口值,如果仍然为零,那么收到这个报文段的一方重新设置持续计数器,如果窗口不是零,那么死锁的僵局就可以打破了。

在TCP的实现中广泛使用Nagle算法计算TCP报文段的发送时机:

若发送应用进程把要发送的数据逐个字节地发送到TCP的发送缓存,则发送方就把第一个数据字节先发送出去,把后面到达的数据字节都缓存起来,当发送方收到对第一个数据字符的确认后,再把发送缓存中的所有数据组装成一个报文段发送出去,同时继续对随后到达的数据进行缓存。只有在收到对前一个报文段的确认后才继续发送下一个报文段。当数据到达较快而网络速率较慢时,用这种方法可明显地减少所用的网络带宽。算法还规定,当到达的数据已达到发送窗口的大小的一半或已达到报文段的最大长度时,立即发送一个报文段。

TCP的拥塞控制

在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,这种情况就叫做拥塞。

所谓拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制所要做的一个前提,就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。

流量控制往往是指点对点通信量的控制,是个端到端的问题。流量控制所要做的就是抑制发送端发送数据的速率,以便接收端来得及接收。

闭环控制措施:

1)检测网络系统以便检测到拥塞在何时、何处发生。2)把拥塞发生的信息传送到可采取行动的地方。3)调整网络系统的运行以解决出现的问题。

TCP拥塞控制方法

在这里插入图片描述

慢开始(slow-start)、拥塞避免(congestion avoidance)、快重传(fast retransmit)和快恢复(fast recovery)

假定:1)数据是单方向传送,而另一个方向只传送确认。2)接收方总是有足够大的缓存空间,因而发送窗口的大小由网络的拥塞程度来决定。

1、慢开始和拥塞避免

发送端的主机在确定发送报文段的速率时,既要根据接收端的接收能力,又要考虑不要使网络发生拥塞。

每一个TCP连接需要有以下两个状态变量:

1)接收端窗口rwnd(receiver window)又称为通知窗口(advertised window)。rwnd是接收端根据目前的接收缓存大小所许诺的最新的窗口值,是来自接收端的流量控制,接收端将此窗口值放在TCP报文的首部中的窗口字段,传送给发送端。

2)拥塞窗口cwnd(congestion window),cwnd是发送端根据自己估计的网络拥塞程度而设置的窗口值,是来自发送端的流量控制。

发送方的窗口上限值应当取为接收方窗口rwnd和拥塞窗口cwnd这两个变量中较小的一个。

当rwnd<cwnd时,是接收方的接收能力限制发送方窗口的最大值。

当cwnd<rwnd时,是网络的拥塞程度限制发送方窗口的最大值。

慢开始算法的原理:在主机刚刚开始发送报文段时可先将拥塞窗口cwnd设置为2到4个最大报文段SMSS的数值。在每收到一个对新的报文段的确认后,将拥塞窗口增加至多一个SMSS的数值。用这样的方法逐步增大发送端的拥塞窗口cwnd,可以使分组注入到网络的速率更加合理。每经过一个传输轮次(transmission round),拥塞窗口cwnd就加倍。

假设拥塞窗口cwnd的大小是N个报文段,那么这时的往返时间RTT就是发送方连续发送N个报文段,并收到这N个报文段的确认,总共经历的时间。

拥塞避免算法的原理:让cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是像慢开始阶段那样加倍增长。因此在拥塞避免阶段就有“加法增大”AI(Additive Increase)的特点,在拥塞避免阶段,拥塞窗口cwnd按线性规律缓慢增长,比慢增长算法的拥塞窗口增长速率缓慢的多。

2、快重传和快恢复

有时,个别报文段在网络中丢失,但实际上网络并未发生拥塞,如果发送方迟迟收不到确认,就会产生超时,就会误认为网络发生了拥塞,这就导致发送方错误地启动慢开始,把拥塞窗口cwnd又设置为1,因而降低了传输速率。

采用快重传算法可以让发送方尽早知道发生了个别报文段的丢失。快重传首先要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认,即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认。例如:接收方收到M1和M2都分别及时发出了确认,现假定M3丢失,接收方没有收到却收到了M4,接收方必须立即发送对M2的重复确认,发送方接着发送M5和M6,接收方收到后也仍要再次分别发出对M2的重复确认。快重传算法规定,发送方只要一连收到3个重复确认,就知道接收方确实没有收到报文段M3,因而应当立即进行重传即快重传。这样就不会出现超时,发送方也就不会误认为出现了网络拥塞。使用快重传可以使整个网络吞吐量提高约20%。

发送方知道只是丢失了个别的报文段,于是不启动慢开始,而是执行快恢复算法,发送方调整门限值ssthresh=cwnd/2,设置拥塞窗口cwnd=ssthresh,并开始执行拥塞避免算法。

主动队列管理AQM

网络层的策略对TCP拥塞控制影响最大的就是路由器的分组丢弃策略。在最简单的情况下,路由器的队列通常都是按照先进先出FIFO的规则处理到来的分组,由于队列长度总是有限的,当队列已满时,以后再到达的所有分组将都被丢弃,这就叫做尾部丢弃策略。

主动队列管理AQM,就是不要等到路由器的队列长度已达到最大值时才不得不丢弃后面到达的分组,应当在队列长度达到某个值得警惕的数值时就主动丢弃到达的分组,这样就提醒了发送方放慢发送的速率,因而有可能使网络拥塞的程度减轻。

随机早期检测RED(Random Early Detection),实现RED时需要使路由器维持两个参数,即队列长度最小门限和最大门限,当每一个分组到达时,RED就按照规定的算法先计算当前的平均队列长度,若平均队列长度小于最小门限,则把新到达的分组放入队列进行排队,若平均队列长度超过最大门限,则把新到达的分组丢弃,若平均队列长度在最小门限和最大门限之间,则按照某一丢弃概率p把新到达的分组丢弃,让拥塞控制在个别的TCP连接上进行,避免发送全局性的拥塞控制。

TCP运输连接管理

TCP是面向连接的协议。运输连接是用来传送TCP报文的。TCP运输连接的建立和释放是每一个面向连接的通信中必不可少的。

运输连接有三个阶段,连接建立、数据传送和连接释放。运输连接管理就是使运输连接的建立和释放都能正常地进行。

TCP连接的建立采用客户服务器方式,主动发起连接建立的应用进程叫客户(client),而被动等待连接建立的应用进程叫做服务器(server)。

TCP的连接建立 — 三次握手

在这里插入图片描述

? 一开始,B的TCP服务器进程先创建传输控制块TCB,准备接受客户进程的连接请求,然后服务器进程就处于LISTEN(收听)状态,等待客户的连接请求。如有,即做出响应。

? A的TCP客户进程也是首先创建传输控制模块TCB,在打算建立TCP连接时,向B发出连接请求报文段,这时首部中的同步位SYN=1,同时选择一个初始序号seq=x,TCP规定,SYN报文段(即SYN=1的报文段)不能携带数据,但要消耗掉一个序号。这时TCP客户进程进入SYN-SENT(同步已发送)状态。

? B收到连接请求报文段后,如同意建立连接,则向A发送确认,在确认报文段中应把SYN和ACK都置1,确认号是ack=x+1,同时也为自己选择一个初始序号seq=y。这个报文段也不能携带数据,但同样要消耗掉一个序号。这时TCP服务器进程进入SYN-RCVD(同步收到)状态。

? A收到B的确认后,还要向B发送确认。确认报文段的ACK置1,确认号ack=y+1,而自己的序号seq=x+1。TCP的标准规定,ACK报文段可以携带数据,但如果不携带数据则不消耗序号,在这种情况下,下一个数据报文段的序号仍是seq=x+1。这时TCP连接已经建立,A进入ESTABLISHED(已建立连接)状态。

? 当B收到A的确认后,也进入ESTABLISHED状态。

A最后还要发送一次确认的原因是为了避免产生“已失效的连接请求报文段”,假定出现一种异常情况,即A发出的第一个连接请求报文段没有丢失,而是在某些网络结点长时间滞留了,A超时后再重传一次连接请求,之后数据传送完毕,连接被释放,而第一个请求报文延误到连接释放以后的某个时间才到达B,B收到此失效的连接请求报文后,就误认为是A又发出一次新的连接请求。于是向A发出确认报文段,同意建立连接,假定不采用报文握手,那么只要B发出确认,新的连接就建立了,由于A并没有发出连接建立的请求,因此不会理睬B的确认,也不会向B发送数据。但B却以为新的连接已经建立了,并一直等待A发来数据,B的许多资源就这样浪费了。

TCP的连接释放 —— 四次挥手

在这里插入图片描述

? 数据传输结束后,通信的双方都可以释放连接。现在A和B都处于ESTABLISHED状态。A的应用进程先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。A把连接释放报文段首部的终止控制位FIN置1,其序号seq=u,它等于前面已传送过的数据的最后一个字节的序号加1,这时A进入FIN-WAIT-1(终止等待1)状态,等待B的确认。TCP规定FIN报文段即使不携带数据,它也消耗掉一个序号。

? B收到连接释放报文段后即发出确认,确认号是ack=u+1,而这个报文段自己的序号是v,等于B前面已传送过的数据的最后一个字节的序号加1。然后B就进入CLOSE-WAIT(关闭等待)状态。TCP服务器进程这时应通知高层应用进程,因而从A到B这个方法的连接就释放掉了,这时的TCP连接处于半关闭(half-close)状态,即A以及没有数据要发送了,但B若发送数据,A仍要接收,也就是说,从B到A这个方向的连接并未关闭,这个状态可能会持续一段时间。

? A收到来自B的确认后,就进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。

? 若B已经没有要向A发送的数据,其应用进程就通知TCP释放连接,这时B发出的连接释放报文段必须使FIN=1。现假定B的序号为w(在半关闭状态B可能又发送了一些数据)。B还必须重复上次已发送过的确认号ack=u+1。这时B就进入LAST-ACK(最后确认)状态,等待A的确认。

? A在收到B的连接释放报文段后,必须对此发出确认。在确认报文段中把ACK置1,确认号ack=w+1,而自己的序号是seq=u+1,然后进入到TIME-WAIT(时间等待)状态。现在TCP连接还没有释放掉,必须经过时间等待计时器(TIME-WAIT timer)设置的时间2MSL后,A才进入到CLOSED状态。时间MSL叫做最长报文段寿命。

? B只要收到了A发出的确认,就进入CLOSED状态。

A在TIME-WAIT状态必须等待2MSL的时间原因:

1)为了保证A发送的最后一个ACK报文段能够到达B,这个ACK报文段可能丢失,B会超时重传这个FIN+ACK报文段,而A就能在2MSL时间内收到这个重传的FIN+ACK报文段,接着A重传一次确认,重新启动2MSL计时器。最后A和B都正常进入CLOSED状态。如果A在TIME-WAIT状态下不等待一段时间,那么就无法收到B重传的FIN+ACK报文段,也不会再次发送一次确认,这样B就无法按照正常步骤进入CLOSED状态。

2)防止“已失效的连接请求报文段”出现在本连接中。

保活计时器(KeepAlice timer)

要收到了A发出的确认,就进入CLOSED状态。

A在TIME-WAIT状态必须等待2MSL的时间原因:

1)为了保证A发送的最后一个ACK报文段能够到达B,这个ACK报文段可能丢失,B会超时重传这个FIN+ACK报文段,而A就能在2MSL时间内收到这个重传的FIN+ACK报文段,接着A重传一次确认,重新启动2MSL计时器。最后A和B都正常进入CLOSED状态。如果A在TIME-WAIT状态下不等待一段时间,那么就无法收到B重传的FIN+ACK报文段,也不会再次发送一次确认,这样B就无法按照正常步骤进入CLOSED状态。

2)防止“已失效的连接请求报文段”出现在本连接中。

保活计时器(KeepAlice timer)

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-07-16 11:40:31  更:2021-07-16 11:42:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 23:00:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计