愿我们都能成为最好的自己!平安喜乐,迎风奔跑吧~
《计算机网络》内容整理:
文章目录
传输层服务
进程间的通信
- 传输层向它上面的应用层提供通信服务,它是面向通信部份的最高层,也是用户功能的最低层
- 两台主机进行通信实际上就是两个主机中的应用进程互相通信。IP协议虽然能把分组送到主机,但是这个分组还停留在主机的网络层而没有交付给主机的应用进程。
- 从传输层看,通信真正的端点并不是主机而是主机中的进程。端到端的通信是应用进程之间的通信。
- 网络层为主机之间提供逻辑通信,传输层提供应用进程间端到端的逻辑通信
- 进程间相互作用模式:Client/Server模型
- 传输层的一个很重要的功能就是复用和分用
- 要对收到的报文进行差错检测
- 全双工的可靠信道(实际有两条信道)
- 两种不同的传输协议
- 面向连接的 TCP(Transmission Control Protocol);数据单位:TCP 报文段(segment);不提供广播和多播服务
- 无连接的UDP(User Datagram Protocol);数据单位:UDP 报文或用户数据报
复用(multiplexing)与分用(demultiplexing)
- 传输层和进程之间通过套接字(socket)传递数据
- 套接字有唯一标识符,通过不同的套接字确定传输层分组:
- 发送端复用:处理来自多个Socket的数据,加上传输层首部
- 接收端分用:利用首部信息将接收到的报文段传送到正确的socket
传输层的端口
- 传输层使用协议端口号(protocol port number),或通常简称为端口(port)
- 端口用一个 16 位端口号进行标志,端口号只具有本地意义,即端口号只是为了标志本计算机应用层中的各进程。在因特网中不同计算机的相同端口号是没有联系的
- 服务器端使用的端口号:
- 熟知端口号(well-known port number)或系统端口号:数值一般为 0~1023,指派给了一些重要应用程序,让所有的用户知道
- 登记端口号,数值在1024~49151,为没有熟知端口号的应用准备
- 客户端使用的端口号:数值为49152~65535。这类端口号仅在客户进程运行时才动态选择,因此又叫短暂端口号。当服务器进程收到客户进程的报文时,就知道了客户进程所使用的端口号,因而可以把数据发送给客户进程。通信结束后,刚才已使用的客户端口号就不复存在,这个端口号可以给其他客户进程使用。
用户数据报协议UDP
UDP主要特点:
- 无连接的、不可靠的传输层协议;
- 只在 IP 的数据报服务之上增加了很少一点的功能,即端口的功能(复用分用)和差错检测的功能;
- 虽然 UDP 用户数据报只能提供不可靠的交付,但 UDP 在某些方面有其特殊的优点
- 面向报文:A. 发送方 UDP 对应用程序交下来的报文,在添加首部后就向下交付 IP 层。UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界;B. 应用层交给 UDP 多长的报文,UDP 就照样发送,即一次发送一个报文;C. 接收方 UDP 对 IP 层交上来的 UDP 用户数据报,在去除首部后就原封不动地交付上层的应用进程,一次交付一个完整的报文;D. 应用程序必须选择合适大小的报文
- 没有拥塞控制
- 支持一对一、一对多、多对多的交互通信
- 首部开销小
套接字
有唯一标识符,端口号拼接到(concatenated with) IP 地址即构成了socket。UDP socket是由一个包含目的IP地址和目的端口号的二元组来标识的。因此,如果两个UDP报文段有不同的源IP地址和/或源端口号,但具有相同的目的IP地址和目的端口号,那么这两个报文段将通过相同的目的套接字定向到相同的目的进程
首部格式:
- 首部字段(8个字节):源地址(2)、目的地址(2)、长度(2,UDP数据报的长度)、检验和(2)
- 伪首部(12个字节):在计算检验和时,临时把“伪首部”和 UDP 用户数据报连接在一起。伪首部仅仅是为了计算检验和
- 如果接收方UDP发现报文中的端口号不正确(即不存在对应该端口号的应用程序),就丢弃该报文,并由网际控制报文协议ICMP发送“端口不可达”差错报文给发送方
传输控制协议TCP⭐
TCP特点
- TCP是一种面向连接的、可靠的传输层协议;
- TCP协议建立在不可靠的网络层IP协议之上,IP不能提供任何可靠性机制,TCP的可靠性完全由自己实现;(可靠:无差错、不丢失、不重复,按序到达)
- TCP提供的是全双工服务
- 每一条TCP连接只有两个端点(endpoint),只能是点对点的(一对一)
- TCP是面向字节流的
- “流”(stream) 是指流入到进程或从进程流出的字节序列。
- 虽然应用程序和TCP交互是一次一个数据块(大小不等),但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。TCP并不知道所传送的字节流的含义。 TCP不保证接收方应用程序接收到的数据块和发送方应用程序发出的数据块具有对应大小的关系。但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。
- TCP 对应用进程一次把多长的报文发送到TCP 的缓存中是不关心的
- TCP 根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节(UDP 发送的报文长度是应用进程给出的)
- TCP 可把太长的数据块划分短一些再传送。TCP 也可等待积累有足够多的字节后再构成报文段发送出去
- TCP socket
- TCP socket由4元组所确定:源IP地址源端口号目的IP地址目的端口号
- 分用:接收方利用这四个字段的值来实现报文段的正确分发
TCP报文格式
- 源端口和目的端口字段——各占 2 字节。端口是传输层与应用层的服务接口。传输层的复用和分用功能都要通过端口才能实现
- 序号字段(seq)——占 4 字节。TCP 连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号
- 确认号字段(ack)——占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。
确认号 = N, 则表明到序号N-1为止的所有数据都已正确收到 - 首部长度(数据偏移)——占 4 位,TCP首部长度以4字节为一个单元来计算的,实际报头长度是20B-60B,因此,该字段值是5-15之间
- 保留字段——占 6 位,保留为今后使用,但目前应置为 0
- 六个控制位:
- 紧急 URG(URGent) —— 当 URG = 1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)
当URG=1时,发送方TCP把紧急数据插入到本报文的最前面,后面仍是普通数据。这时与紧急指针配合使用 - 确认 ACK(ACKnowledgment) —— 只有当 ACK = 1 时确认号字段才有效。当 ACK = 0 时,确认号无效。在连接建立后,所有传送的报文段都把ACK置为1
- 推送 PSH (PuSH) —— 接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付
- 复位 RST (ReSeT) —— 当 RST = 1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立传输连接。
RST置1还用来拒绝一个非法的报文段或拒绝打开一个连接 - 同步 SYN(SYNchronization) —— SYN=1&&ACK=0连接请求,SYN=1&&ACK=1连接接受。所以,同步 SYN = 1 表示这是一个连接请求或连接接受报文
- 终止 FIN (Finish) —— 用来释放一个连接。FIN= 1 表明此报文段的发送端的数据已发送完毕,并要求释放传输连接
- 紧急 URG(URGent) —— 当 URG = 1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)
- 窗口字段 —— 占 2 字节,发送本报文一端的接收窗口,用来让对方设置发送窗口的依据,单位为字节。窗口值是[0,2^16-1]之间的整数。窗口字段明确指出了现在允许对方发送的数据量,窗口值经常在动态变化着
- 检验和 —— 占 2 字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在TCP 报文段的前面加上 12 字节的伪首部(协议字段为6,表示TCP)
- 紧急指针(Urgent Pointer) 字段—— 占 16 位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)即使窗口为0时也可以发送紧急数据
- 选项长度可变
- 最大报文段长度MSS(Maximum Segment Size) TCP最先只规定的一种选项。MSS是每一个TCP报文段中的数据字段的最大长度,加上TCP首部才是整个报文段。(为了传输效率,MSS应尽可能大些,只要在IP层不用再分片就行,默认536字节长,536+20=556)
- 窗口扩大选项 ——占 3 字节,其中有一个字节表示移位值 S。新的窗口值等于TCP 首部中的窗口位数增大到 (16 + S),相当于把窗口值向左移动 S 位后获得实际的窗口大小
- 时间戳选项——占10 字节,其中最主要的字段时间戳值字段(4 字节)和时间戳回送回答字段(4 字节):用来计算往返时间RTT;用于处理TCP序号超过2^32的情况,这又称为防止绕回PAWS(Protect Against Wrapped Sequence numbers)
- 选择确认SACK选项——在后面介绍
- 填充字段 —— 这是为了使整个首部长度是 4 字节的整数倍
TCP可靠通信
让我们来看看怎样实现一个可靠的传输
- 可靠信道(无差错,无丢包) 不需要做任何事
- 有差错的信道:
- 检错:校验码
- 恢复错误:确认机制。acknowledgements (ACKs): 接收方通知发送方数据正确;negative acknowledgements (NAKs):接收方通知发送方数据错误
- 如果ACK/NAK错误:发送方重传数据包,每个数据包加上序号,接收方丢弃重复的数据包
- 只使用ACKs:接收方发送对上一个正确接收的数据包的确认(添加序号),发送方收到重复确认就重传当前数据包
- 有差错、有丢包的信道:
- 发送方等待一段时间,如果没收到ACK,则重传
- 如果数据或确认只是延迟而不是丢失,重传将导致重复报文段,序号可以解决这一问题。接收方收到重复报文时,丢弃重复报文;发送方收到重复的确认帧时,收下,但什么也不做
- 接收方必须在确认报文中包含序号。
- 需要一个计时器
停止-等待协议
- 可靠通信的实现
- 使用上述的检验码、确认、序号和超时重传机制,我们就可以在不可靠的传输网络上实现可靠的通信
- 这种可靠传输协议常称为自动重传请求ARQ (Automatic Repeat reQuest)
- ARQ 表明重传的请求是自动进行的。接收方不需要请求发送方重传某个出错的分组
你以为结束了吗?当然还没完,让我们看看这种情况下惨不忍睹的信道利用率
- 信道利用率:停止等待协议的优点是简单,但缺点是信道利用率太低
- 流水线传输:
- 发送方可连续发送多个分组,不必每发完一个分组就停顿下来等待对方的确认
- 由于信道上一直有数据不间断地传送,这种传输方式可获得很高的信道利用率
- 必须增加序号范围
- 协议的发送方和接收方也许必须缓存多个分组(由此引出窗口和缓存)
- 流水线差错恢复有两种基本方法:回退N( Go-back-N )和选择重传
- Go-back-N(回退 N)
- 发送方可以在流水线中保持最多N个未确认的报文段
- 接收方发送累积确认,即不必对收到的分组逐个发送确认,而是对按序到达的最后一个分组发送确认,这样就表示:到这个分组为止的所有分组都已正确收到了
- 发送方维护最早未确认报文段的计时器,如果计时器时间到,则重传所有未确认报文段
- 累积确认有的优点是:容易实现,即使确认丢失也不必重传。缺点是:不能向发送方反映出接收方已经正确收到的所有分组的信息
- 选择重传(SR)
- 发送方可以在流水线中保持最多N个未确认的报文段
- 要求接收方逐个的确认正确接收的报文
- 发送方只重传出错的TCP报文
- 发送方为每一个未确认的报文维护计时器,计时时间到,重传未确认的报文。
- TCP 可靠传输的实现
- TCP 每发送一个报文段,就对这个报文段设置一次计时器。只要计时器设置的重传时间到但还没有收到确认,就要重传这一报文段。实际上只设置了一个计时器,就是最早发出的且尚未收到确认报文的那个
- 如何设置重传计时器的时间?过小的值导致频繁的超时和不必要的重传;过大的值导致延迟(如果报文段丢失)。利用RTT(Round-Trip Time)
- 加权平均往返时间
- TCP 保留了 RTT 的一个加权平均往返时间 RTTs(这又称为平滑的往返时间)
- 第一次测量到 RTT 样本时,RTTS 值就取为所测量到的RTT 样本值。以后每测量到一个新的 RTT 样本,就按下式重新计算一次 RTT
- 式中,0 ≤ α < 1。若 α 很接近于零,表示 RTT 值更新较慢。若选择 α 接近于 1,则表示 RTT 值更新较快。RFC 2988 推荐的 α 值为 1/8,即 0.125。
- 超时重传时间 RTO(RetransmissionTime-Out)
- RTO 应略大于上面得出的加权平均往返时间 RTTs
- RFC 2988 建议使用下式计算 RTO:RTO = RTTS + 4 × RTTD
- RTTD 是 RTT 的偏差的加权平均值
- RFC 2988 建议这样计算 RTTD。第一次测量时,RTTD 值取为测量到的 RTT 样本值的一半。在以后的测量中,则使用下式计算加权平均的 RTTD
- 是个小于 1 的系数,其推荐值是 1/4,即 0.25。
但是依然会出现一些问题:发送出一个报文段,设定的重传时间到了,还没有收到确认,于是重传,经过一段时间后,收到了确认报文段,那么,如何判定:收到的这个报文段是对先发送的报文的确认,还是后发送的报文的确认?
- Karn 算法
- 在计算平均往返时间 RTT 时,只要报文段重传了,就不采用其往返时间样本
- 报文段每重传一次,就把RTO增大为原来的2倍,最大值64秒
- 选择确认 SACK(Selective ACK)
- 接收方收到了和前面的字节流不连续的字节块
- 如果这些字节的序号都在接收窗口之内,那么接收方就先收下这些数据,但要把这些信息准确地告诉发送方,使发送方不要再重复发送这些已收到的数据
- RFC 2018 的规定
- 如果要使用选择确认,那么在建立 TCP 连接时,就要在 TCP 首部的选项中加上“允许 SACK”的选项,而双方必须都事先商定好
- 如果使用选择确认,那么原来首部中的“确认号字段”的用法仍然不变。只是以后在 TCP 报文段的首部中都增加了 SACK 选项,以便报告收到的不连续的字节块的边界
- 由于首部选项的长度最多只有 40 字节,而指明一个边界就要用掉 4 字节,因此在选项中最多只能指明 4 个字节块的边界信息
TCP流量控制
- 如果发送方把数据发送得过快,接收方就可能来不及接收,这就会造成数据的丢失
- 流量控制(flow control) 就是让发送方的发送速率不要太快,让接收方来得及接收
- 利用滑动窗口机制可以很方便地在 TCP 连接上实现流量控制
- 发送缓存与接收缓存:
接收缓存和接收窗口的前沿相同
接收缓存的作用:- 按序到达的、但尚未被接收应用程序读取的数据;
- 不按序到达的数据。
发送缓存与发送窗口的后沿相同
发送缓存的作用: - 发送应用程序传送给发送方 TCP 准备发送的数据;
- TCP 已发送出但尚未收到确认的数据。
- TCP以字节为单位的滑动窗口
发送端维护三个指针
- 这里需要强调:
- A 的发送窗口并不总是和 B 的接收窗口一样大(因为有一定的时间滞后)
- TCP 标准没有规定对不按序到达的数据应如何处理。通常是先临时存放在接收窗口中,等到字节流中所缺少的字节收到后,再按序交付上层的应用进程
- TCP 要求接收方必须有累积确认的功能,这样可以减小传输开销
- example:
- B 向 A 发送了零窗口的报文段后不久,B 的接收缓存又有了一些存储空间。于是 B 向 A 发送了 rwnd = 400 的报文段
- 但这个报文段在传送过程中丢失了。A 一直等待收到 B 发送的非零窗口的通知,而 B 也一直等待 A 发送的数据,产生死锁
- 为了解决这个问题,TCP 为每一个连接设有一个持续计时器(persistence timer)。只要 TCP 连接的一方收到对方的零窗口通知,就启动该持续计时器
- 若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带 1 字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值
- 若窗口仍然是零,则收到这个报文段的一方就重新设置持续计时器
- 若窗口不是零,则死锁的僵局就可以打破了
TCP拥塞控制
- 网络出现拥塞(congestion) 的条件:对资源的需求总和 > 可用资源
- 拥塞控制与流量控制的区别:
- 拥塞控制方法:
- 发送方维持一个叫做拥塞窗口 cwnd (congestion window) 的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。
- 发送窗口 = min [接收窗口,拥塞窗口]
- 四种算法:慢开始(slow-start)、拥塞避免(congestion avoidance)、快重传(fast retransmit)和快恢复(fast recover)
- 发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的报文段发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的报文段数。发送方根据超时来预测网络出现拥塞,接收方可以通过发送重复确认来报告拥塞。
- 发送方维护两个变量:cwnd, ssthresh(慢开始门限)
- 慢开始和拥塞避免:
- 初始cwnd = 1 MSS
if cwnd <= MSS, 执行慢开始算法,每收到一个确认cwnd = cwnd + MSS
else 执行拥塞避免算法,每收到一个确认,cwnd = cwnd + MSS*MSS/cwnd - 当拥塞发生(超时),sstresh = max(2, min(cwnd, rwnd)/2)(其实就是当前的窗口值的一半);cwnd = 1 MSS
- 初始cwnd = 1 MSS
- 传输轮次(transmission round)
- 使用慢开始算法后,每经过一个传输轮次,拥塞窗口cwnd 就加倍
- 一个传输轮次所经历的时间其实就是往返时间RTT
- “传输轮次”更加强调:把拥塞窗口 cwnd 所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个字节的确认
- example: 拥塞窗口 cwnd = 4,这时的往返时间RTT 就是发送方连续发送 4 个报文段,并收到这 4 个报文段的确认,总共经历的时间
- 当网络出现拥塞时
- 无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有按时收到确认),就要把慢开始门限 ssthresh 设置为出现拥塞时的发送方窗口值的一半(但不能小于2)
- 然后把拥塞窗口 cwnd 重新设置为 1,执行慢开始算法
- 这样做的目的就是要迅速减少主机发送到网络中的报文段数,使得发生拥塞的路由器有足够时间把队列中积压的报文段处理完毕
- example:
- 乘法减小(multiplicative decrease) :“乘法减小“是指不论在慢开始阶段还是拥塞避免阶段,只要出现一次超时(即出现一次网络拥塞),就把慢开始门限值ssthresh 设置为当前的发送窗口值乘以0.5。当网络频繁出现拥塞时,ssthresh 值就下降得很快,以大大减少注入到网络中的分组数
- 加法增大(additive increase): “加法增大”是指执行拥塞避免算法后,在收到对所有报文段的确认后(即经过一个往返时间),就把拥塞窗口 cwnd增加一个 MSS 大小,使拥塞窗口缓慢增大,以防止网络过早出现拥塞。
- “拥塞避免”并非指完全能够避免了拥塞。利用以上的措施要完全避免网络拥塞是不可能的。“拥塞避免”是说在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞
- 快重传和快恢复(TCP Reno)
- 快重传:快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认。这样做可以让发送方及早知道有报文段没有到达接收方。发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段。
- 快恢复:A. 当发送端收到连续三个重复的确认时,就执行“乘法减小”算法,把慢开始门限 ssthresh 减半。但接下去不执行慢开始算法。B. 由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,即拥塞窗口 cwnd 现在不设置为 1,而是设置为慢开始门限 ssthresh 减半后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。
- 另一版本的快恢复:cwnd = (新)sstresh + 3*MSS,理由是:既然发送方已经收到三个重复的确认,就表明有3个分组已经离开了网络。这3个分组不再消耗网络资源而是停留在接收方的缓存中,即网络中并不是堆积了三个分组,而是减少了3个分组,所以可以适当扩大拥塞窗口
- 快重传:快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认。这样做可以让发送方及早知道有报文段没有到达接收方。发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段。
- 总结:
TCP面向连接(TCP传输连接建立与释放)
- TCP通信要经历三个阶段:
- 连接建立阶段—某一对等通信实体间的TCP连接建立可通过“握手”机制来完成(三次握手)
- 数据传送阶段—一旦双方建立起TCP连接之后,则可进入数据传送阶段
- 连接关闭阶段—当数据传送结束后,TCP发送方向接收方发送出关闭连接请求,但仍可接收数据,只有当接收方发出了对关闭连接请求的确认,发送方收到该确认后才能正式关闭该连接(四次挥手)
- TCP 连接建立
要解决三个的问题:A. 要使每一方能够确知对方的存在;B. 要允许双方协商一些参数(如最大报文段长度,最大窗口大小,服务质量等);C. 能够对传输实体资源(如缓存大小,连接表中的项目等)进行分配
客户服务器方式
- 第一次握手:A的TCP向B发出连接请求报文段,其首部中的同步位SYN=1,并选择序号seq = x,表明传送数据时的第一个数据字节的序号是x。初始序号其实是随机生成的,实际上只发送了TCP首部,为了安全
这里注意,服务器端在客户端发送连接请求前一直处于监听状态,有一个监听socket - 第二次握手:B的TCP收到连接请求报文后,如同意,则发回确认。确认报文中,SYN=1,ACK=1,确认号 ack = x+1,自己选择的序号y。x与y无关
- 第三次握手:A收到此报文后向B给出确认,其ACK=1,确认号ack = y+1。A的TCP通知上层应用进程,连接已经建立。B的TCP收到主机A的确认后,也通知上层应用进程连接建立。
- 为什么需要三次握手?如果这并不是新的连接请求,是上一次的,而且之前连接已经释放,那么仅仅“两次握手”会使B确认连接,“半开连接”产生浪费。
(如何判断是不是一个新的连接请求呢?看套接字是否相同)
- 第一次握手:A的TCP向B发出连接请求报文段,其首部中的同步位SYN=1,并选择序号seq = x,表明传送数据时的第一个数据字节的序号是x。初始序号其实是随机生成的,实际上只发送了TCP首部,为了安全
- 数据传送
- TCP的连接释放
- 第一次挥手:传输结束后,通信双方都可以释放连接,现在A的应用进程先向TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。A把连接释放报文首部FIN=1,序号seq = u,等待B的确认
- 第二次挥手:B发出确认,确认号ack = u+1,本报文段自己序号seq = v。TCP服务器进程通知高层应用进程。从A到B这个方向的连接就释放了,TCP连接处于半关闭状态。若B发送数据,A仍要接收
- 第三次挥手:若B已经没有要发送的数据,其应用进程通知TCP释放连接。FIN = 1, ACK = 1, seq = w,ack = u+1。若B没有要传输的数据,第二次挥手和第三次挥手可以合并。在二三两次挥手间 B向A传输数据时,A仍要回应。
- 第四次挥手:A在确认报文段中ACK = 1, 确认号ack = w+1,自己的序号seq = u +1。B收到报文后,就进入closed状态,但在AA端,TCP 连接必须经过时间5.9.2 TCP 2MSL 后才真正释放掉
- A 必须等待 2MSL 的时间:第一,为了保证 A 发送的最后一个 ACK 报文段能够到达 B;第二,防止 “已失效的连接请求报文段”出现在本连接中。A 在发送完最后一个 ACK 报文段后,再经过时间 2MSL,就可以使本连接持续的时间内所产生的所有报文段,都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段
- TCP状态:
- 客户端:
- 服务器:
- 客户端:
- 仅复习所用,侵删