运输层
文章目录
运输层
3.1 运输层服务
3.2 复用与分解
无连接的复用和分解
面向连接分解
3.3 无连接传输: UDP
3.4 可靠数据传输的原则
rdt2.1
rdt2.2
流水线协议
滑动窗口协议
Go-Back_N
选择重传
3.5 面向连接的传输: TCP
报文段结构
3.6 拥塞控制的原理
3.7 TCP拥塞控制
3.1 运输层服务
一,运输层和网络层的比较
运输层为相互通信的应用进程提供了逻辑通信
运输层: 进程间的逻辑通信
网络层: 主机间的逻辑通信
二,运输层协议数据的封装
通常链路层最大传输单元,为1500个字节
TCP具有最大报文长度(MaximumSegment Size,MSS),需减去ip请求头,20个bit,减去20个TCP报头,就是报文长度最大为1460
二,因特网运输层协议
可靠的、按序的交付(TCP)
拥塞控制
流量控制
连接建立
不可靠、不按序交付(UDP)
“尽力而为”IP协议基础上 不提供不必要服务的扩展
它们都是不保证时延和带宽,具体在业务层保证
3.2 复用与分解
多路复用与多路分解将由网络层提供的主机到主机的交付服务延伸到进程到进程的交付服务
分解:将运输层接收到的报文段交付给正确的套接字(一路到多路,向上)
复用:从多个套接字收集数据,用首部封装数据(多路到一路,向下)
无连接的复用和分解
UDP套接字由二元组标识:
目标ip
目标端口
思考:
假定在主机C上的一个进程有一个具有端口号6789的UDP套接字。假定主机A和主机B都用目的端口号6789向主机C发送一个UDP报文段。这两台主机的这些报文段在主机C都被描述为相同的套接字吗?如果是这样的话,在主机C的该进程将怎样知道源于两台不同主机的这两个报文段?
答:是的,两个报文段都将指向同一个套接字。UDP套接字由二元组标识。对于每个接收到的报文段,操作系统都将向进程提供其源IP地址,通过所收到的IP数据报可以确定各个报文段的起源
面向连接分解
TCP套接字由四元组标识:
源IP地址
源端口号
目的IP地址
目的端口号
思考:假定在主机C端口80上运行的一个Web服务器。假定这个Web服务器使用持续连接,并且正在接收来自两台不同主机A和B的请求。被发送的所有请求都通过位于主机C的相同套接字吗?如果它们通过不同的套接字传递,这两个套接字都具有端口80吗?讨论和解释之
答:对于每个持久连接,Web服务器都会创建一个单独的“连接套接字”。每个连接套接字由一个四元组标识:(源IP地址、源端口号、目标IP地址、目标端口号)。当主机C接收到IP数据报时,它会检查数据报中的这四个字段,以确定它应该将TCP报文段的有效负载传递到哪个套接字。因此,来自A和B的请求通过不同的套接字。A和B的请求会通过80端口找到Web服务器进程, 就这里而言它们通过C的欢迎套接字进行三次握手连接, 这个欢迎套接字具有端口80.当它们与服务器进程建立连接的时候,服务器进程会单独为它们分配套接字, 通过专门的“连接套接字”响应客户端的请求. 这两个套接字就不具有80端口了
多线程Web服务器
当今高性能Web服务器通常只使用一个进程,但为每个新的客户连接创建一个具有新连接套接字的新线程
3.3 无连接传输: UDP
UDP协议特点
无连接创建(它将增加时延)
简单:在发送方、接收方无连接状态
段首部小
无拥塞控制: UDP能够尽可能快地传输
丢包
对应用程序交互失序
应用:
DNS
路由表更新
SNMP(简单网络管理协议)
要想有可靠性,必须在应用层增加
UDP检验和
将报文所有内容分隔为16比特整数序列,初始UDP校验和位置全为0,然后全部相加后,取反,即为UDP校验和
当数字作加法时,最高位进比特位的进位需要加到结果中
思考:UDP提供的是端到端的差错检测,链路层对传输过程的帧进行差错检查。因此UDP提供的差错检查是否没有必要?
我没搞懂
3.4 可靠数据传输的原则
不可靠信道的特点决定了可靠数据传输协议(rdt) 的复杂性
我们逐渐递增地研究可靠数据传输协议(rdt) 的发送方和接收方
###rdt1
底层信道非常可靠:无比特差错且分组按序无丢失
发送方:
接收方:
但是完美的信道不存在
###rdt2
具有比特差错的底层信道:有比特差错,但分组按序无丢失
与rdt1相比,增加了检错,反馈(ACK为正确收到,NAK为错误收到),重传的机制
它是一个停等协议:发送方发出1个分组,等待 接收方响应后再继续发送
发送方:
接收方:
rdt2有重大缺陷,如果ACK/NAK受损,接收方不清楚将是什么情况,如果重传的话,会导致重复,因此我们需要对每个分组增加序列号,也就是进化成rdt2.1
rdt2.1
发送方,处理受损的ACK/NAK
接收方,处理受损的ACK/NAK
注意:rdt2.1的发送方状态增加了一倍,状态必须“记住”是否 “当前的”分组具有0或1 序号;接收方必须检查是否接收到的分组是冗余的
问题1:两个序号seq. #’ s (0,1) 将够用. ( 为什么?)
因为是停等协议
问题2:必须检查是否收到的ACK/NAK受损?
必须检查,这样才知道发送的包是否成功接收
rdt2.2
这是一个无NAK的协议,只需要在ACK里面带有分组的序号,如果需要不正确,重传即可
###rdt3
能够处理具有差错和丢包的信道
方法:发送方等待ACK一段“合理的”时间,如果没有等待到就重传,简单来说就是加一个定时器
发送方:
rd3效率很低,网络资源利用率很低,由于停等协议
但是停等协议如果不存在的话,发送方网络和接收方的网络能够对报文重排,那么比特交替协议将不能正确工作,将会乱序