TCP的多路复用和分解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP的多路复用和分解相关的知识,希望对你有一定的参考价值。
参考技术A将运输层报文段中的数据交付到正确的套接字的工作称为 多路分解(demultiplexing) ,在源主机当中从不同的套接字中收集数据块,并为每一个数据块封装上首部信息(用于分解)从而生成报文段,然后将此报文段传递到网络层。所有的这些工作称为 多路复用(multiplexing) 。
运输层多路复用的要求:
TCP的首部开销为20个字节,而UDP的首部开销为8字节
UDP虽然实现了检验和,但是对恢复差错无能为力,要么它丢弃受损的报文段,要么将受损的报文段交给应用程序并给出警告。
其中有一个半连接状态:服务器维护一个半连接队列,该队列为每个客户端SYN包开设一个条目,标明服务器已经接到SYN包,并向客户端发出确认,这些条目表示的连接处于SYN_RECV状态,得到客户端的确认后进入ESTABLISHED状态。
TCP采用三次握手是为了防止失效的连接请求报文段突然又传送到了主机B,因而产生错误,失效的连接请求报文段是指:主机A发出的连接请求没有收到主机B的确认,于是经过一段时间后,主机A又重新向主机B发送连接请求,且建立成功,顺序完成数据传输。考虑这样一种特殊情况,主机A第一次发送的连接请求并没有丢失,而是因为网络节点导致延迟达到主机B,主机B以为是主机A又发起的新连接,于是主机B同意连接,并向主机A发回确认,但是此时主机A根本不会理会,主机B就一直在等待主机A发送数据,导致主机B的资源浪费。基于上述原因,采用两次握手是不可行的。
为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
原因有二:
一、保证TCP协议的全双工连接能够可靠关闭
二、保证这次连接的重复数据段从网络中消失
先说第一点,如果Client直接CLOSED了,那么由于IP协议的不可靠性或者是其它网络原因,导致Server没有收到Client最后回复的ACK。那么Server就会在超时之后继续发送FIN,此时由于Client已经CLOSED了,就找不到与重发的FIN对应的连接,最后Server就会收到RST而不是ACK,Server就会以为是连接错误把问题报告给高层。这样的情况虽然不会造成数据丢失,但是却导致TCP协议不符合可靠连接的要求。所以,Client不是直接进入CLOSED,而是要保持TIME_WAIT,当再次收到FIN的时候,能够保证对方收到ACK,最后正确的关闭连接。
再说第二点,如果Client直接CLOSED,然后又再向Server发起一个新连接,我们不能保证这个新连接与刚关闭的连接的端口号是不同的。也就是说有可能新连接和老连接的端口号是相同的。一般来说不会发生什么问题,但是还是有特殊情况出现:假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中,这些延迟数据在建立新连接之后才到达Server,由于新连接和老连接的端口号是一样的,又因为TCP协议判断不同连接的依据是socket pair,于是,TCP协议就认为那个延迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混淆了。所以TCP连接还要在TIME_WAIT状态等待2倍MSL,这样可以保证本次连接的所有数据都从网络中消失。
TCP必须使用端到端的拥塞控制而不是使用网络辅助的拥塞控制,因为IP层不向端系统提供显示的网络拥塞反馈。TCP让每一个发送方根据所感知到的网络拥塞程度来限制他能向连接发送流量的速率。运行在发送方的TCP拥塞控制机制跟踪一个额外的变量 拥塞窗口 ,拥塞窗口对一个TCP发送方能向网络中发送流量的速率进行了限制。 在一个发送方中未被确认的数据量不会超过拥塞窗口和发送窗口中的最小值
计算机网络第三章(多路复用 多路分解)
3.1
IP 尽力而为交付服务 不可靠服务
每个主机有一个IP地址
将主机间交付扩展到进程间交付 运输层的多路复用和多路分解
TCP提供可靠的数据传输
拥塞控制(拥塞:需求大于供给 如果网络中许多资源同时供应不足,网络的性能就要明显变坏 整个网络的吞吐量随负荷增大而降低
TCP使用多种拥塞控制策略来避免雪崩式拥塞。TCP会为每条连接维护一个“拥塞窗口”来限制可能在端对端间传输的未确认分组总数量。)
(补充:流量控制 保证发送者接收者速率匹配)
3.2 多路复用和多路分解
每个运输层的报文段中设置了几个字段,包括源端口号和目的端口号等。
多路分解:接收端,运输层检查字段并标示出它的接收套接字,并该报文定向到对应的套接字(网络和进程间传递数据的门户)
工作方式:主机每个套接字被分配一个端口号,当报文到达主机时,运输层检查报文段中的目的端口号,并将其定向到相应的套接字。
多路复用:从不同套接字收集数据块,并为每个数据块封装上头部,从而产生报文段并将报文段发到网络层。
以上是关于TCP的多路复用和分解的主要内容,如果未能解决你的问题,请参考以下文章