传输层
多路复用和多路分解
定义
- 多路复用:从源主机不同套接字中收集数据块,并为每个数据块封装首部信息从而生成报文段,将报文段传递到网络层
- 多路分解:将传输层报文段中的数据交付到正确的套接字
- 指定要交付的套接字的字段:源端口号和目的端口号
Socket的共用
若两个UDP报文段有不同的源IP地址和源端口号,但有相同的IP地址和目的端口号,则通过相同的套接字定向到相同的目的进程;TCP中,两个有不同源IP地址或源端口号的TCP报文段会被定向到两个不同的套接字
TCP套接字由(源IP地址、源端口号、目的IP地址、目的端口号)来标识
UDP
无连接、不可靠
优点:
- 应用层能更好地控制要发送的数据和发送时间
- 无需建立连接
- 无连接状态
- 分组首部开销小
报文段结构
- 首部:源端口号、目的端口号、长度、检验和
- 应用数据
UDP检验和
发送方对报文段中所有16比特字的和进行反码运算,接收方一起相加,若无差错则和全为1
可靠传输
模型 p137 3-8
构造可靠数据传输协议
p137-144
- rdt1.0:完全可靠信道上的传输
- rdt2.0:加入差错检测、接收方反馈和重传 引入序号
- rdt3.0:有比特交替协议 倒计数定时器
流水线
p146 3-18
- 必须增加序号范围
- 协议的发送方和接收方必须缓存多个分组
解决流水线差错
回退N步(GBN,滑动窗口协议)p147
选择重传(SR)p150
选择重传中,每个分组必须拥有自己的逻辑定时器,接收方和发送方的窗口总是不一致
TCP
面向连接、可靠、全双工
首部长度字段指示32比特字为单位的TCP首部长度
报文段的序号是报文段首字节的字节流编号,故TCP传输的最大文件的大小:2^32
从开始建立连接到收到一次发送的数据的总时间:2RTT,三次握手+一次数据传输
三次握手
四次挥手
为什么TCP握手不是两次或四次
三次握手分别作用:
- 第一次握手后,S可以确认自己收报文与C发报文的功能都正常,而C呢,它什么都不能确认。
- 第二次握手后,C可以确认自己的收发报文与S的收发报文功能都正常,也就是认为连接已建立。
- 那么第三次呢,S也可以确认双方能够正常通信。
两次:防止失效的连接请求报文段被服务端接收,从而产生错误
如果不进行第三次握手,所以在S对C的请求进行回应(第二次握手)后,就会理所当然的认为连接已建立,而如果C并没有收到S的回应呢?此时,C仍认为连接未建立,S会对已建立的连接保存必要的资源,如果大量的这种情况,S会崩溃。
四次:冗余
Time-wait原因
- 为了保证客户端发送的最后1个连接释放确认报文能到达服务器,从而使得服务器能正常释放连接
- 防止上文提到的早已失效的连接请求报文出现在本连接中
客户端发送了最后1个连接释放请求确认报文后,再经过2MSL
时间,则可使本连接持续时间内所产生的所有报文段都从网络中消失,即在下1个新的连接中就不会出现早已失效的连接请求报文
流量控制和拥塞控制的目的
流量控制:消除发送方使接收方缓存溢出的可能性
拥塞控制:减少因为网络的拥塞而丢包的可能性
拥塞控制
- 慢启动:cwnd = 1,每一个传输的报文确认后,cwnd+=1(速率指数增长)
- 拥塞避免:加性增,每过一个RTT,cwnd+=1(速率线性增长)
- 快速恢复:ssthresh = cwnd/2,cwnd = sstresh
TCP快速重传为什么是三次冗余ACK:
两次duplicated ACK时很可能是乱序造成的,三次duplicated ACK时很可能是丢包造成的,四次duplicated ACK更更更可能是丢包造成的,但是这样的响应策略太慢。