运输层的多路复用和多路分解
运输层报文段: 源端口号,目标端口号
多路复用:应用程序将数据交给套接字,到运输层将数据封装成源端口号,目标端口号+数据本身。
多路分解:网络层将数据交到传输层,传输层检查报文的目的端口号,从而交付给相应的进程。
udp提供了差错检验功能
TCP
构造可靠数据传输协议
rdt1.0:假设传输层以下可以提供可靠数据传输,传输层只需要把数据传过去就可以了。
rdt2.0:假设传输层以下时具有比特差错的可靠信道传输。
需要采用ARQ协议(自动重传协议)
当发送方发送数据后进入等待,接收方收到错误报文,发送一个NAK分组。正确报文则发送ACK分组。
rdt2.0有缺点,只考虑了发送方到接收方的数据传输,如果反馈信息ACK,NAK传输时发生比特位翻转会出现什么情况?如果ACK发生翻转,那么发送方会再次重复的发送相同的数据包;如果NAK发生翻转,那么发送方会认为数据传输情况很好,但是接收方却已经收到了一个错误的数据包。
rdt2.1给传输数据分组采用0,1编号,NAK,ACK也用0,1编号,当发送方发送分组0,分组1时,接受方在等待分组0,分组1。发送分组0,接收方收到并返回ACK0,如果ACK变成NAK或者无效,发送方继续发送分组0,接受方拒接,并重新发送ACK0。
rdt2.2 抛弃了NAK,保留ACK,当接受方收到分组1,发送一个ACK1给发送方,如果ACK变成NAK,发送方继续发送分组1,接收方抛弃收到的分组1,并发送一个ACK1,表示分组1已经收到,发分组2给我。
rdt3.0 考虑丢包的可靠数据传输
丢包问题在发送方和接收方两端设置定时重传机制。
流水线可靠数据传输协议
增加了分组序号,不再只是分组0,1,而是0—100,1000。提高了效率。
对分组传输错误有两种处理方式:GBN(回退N步)协议和选择重传协议
发送缓冲区:内存中的区域,进入缓冲区中的分组可以发送。
发送窗口:分组发送但未收到ACK确认,发送窗口是发送缓冲区的子集(可以这么认为)
sw(发送方窗口大小) | RW(接收方窗口大小) | |
---|---|---|
sw=1 | rw=1 | 滑动窗口协议 |
sw>1 | rw=1 | GBN协议 |
sw>1 | rw>1 | SR协议 |
GBN协议当接收方的分组2未到达,但分组三、分组四达到,会直接抛弃分组3、分组4,继续发送ACK2,表示一号分组到达,请求二号分组。
SR协议接收方也维护了一个缓存区,当接收方的分组2未到达,但分组三、分组四达到,不会抛弃分组3、4,会将其缓存再内存了,同时继续发送ACK2,请求2号分组。接收方直到缓冲区中的分组全部到达,才将缓存区中的分组一次性上交给上层。
TCP报文结构
TCP报文首部一般20字节。
TCP除了提供可靠的数据传输服务,还有流量控制,拥塞控制
TCP流量控制(165页特例)
流量控制是为了避免发送方发送速度过快而导致接收方缓冲区溢出从而分组丢失。
流量控制原理:TCP连接双方都维护了一个接受窗口,并将接收窗口的大小放在报文中告知对方。
流量控制是客户端和服务端问题
TCP拥塞控制(拥塞是很正常的事)
拥塞控制是网络问题
网络拥塞原因:当随着路由器的载荷达到了它的带宽,由于分组超时,发送方重新发送分组,使得路由器的缓冲区载荷越来越严重,造成延时,分组继续超时。恶性循环。
解决方法:1、网络提供显著的拥塞信息反馈给端系统
2、端系统自己判断网络是否拥塞。
TCP采用的是2的方法。
端系统如何判断是否拥塞
1、3个冗余ACK确认
2、某个段超时重传
端系统控制发送速率
发生拥塞时:发送窗口变为1,进入慢启动阶段,每次增加一倍,当发送窗口大小变成发生拥塞前的一半时,进入到拥塞避免模式,每次增加一个发送窗口。
TCP的连接建立
3次握手
发送方把序号和确认号给接收方,接收方确认并把自己的序号和确认号给对方,发送方确认收到,则连接建立。(序号和确认号并不是从0开始的)
二次连接会带来服务器维持一个半连接状态
TCP连接释放![在这里插入图片描述](https://img-blog.csdnimg.cn/159b4326e51c42a7bfd058c6451f8c33.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcHJvICBk,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
发送方最后一段等待时间是为了确定接受方有没有收到ACK1确认报文,没收到,接收方就会重新发。当然这样也不够保险,因为可能接收方没收到ACK确认报文,但后发送的连接关闭报文有丢失了。那就没办法了。