OSI wiki
OSI
网络7层协议,4层,5层?理清容易混淆的几个概念
流量控制与拥塞控制
拥塞控制: 慢开始(指数增长到阈值),拥塞避免(阈值加性增加)
出现拥塞时新阈值为当前窗口的一半,如果不使用快速重传,窗口减小为1,重复慢开始
若使用快速重传,当收到3个重复确认时,使用快速恢复,新阈值和窗口均减小为当前窗口的一半,然后加性增加窗口 、
TCP与UDP
TCP报文格式
- 序列号:第一个字节的序列号,接受方可通过序列号+数据长度算出确认号,并将其作为确认号放入应答报文中,4字节[0, 2 ^ 32]会回绕
- 确认号:下次期望收到的序列号,4字节[0, 2 ^ 32]会回绕,当报文为SYN请求报文时,ACK位为0,故没有确认号,连接建立后,ACK位为1,确认号始终有效
- 首部长度/数据偏移:4位(最大值15),是4字节的倍数,也即首部长度,由于TCP首部长度不定(20-60字节),所以需要找到数据起始处,所以TCP首部最大长度为15 * 4字节 = 60字节
- 窗口:2字节[0, 2^16-1],是发送本报文的一方的接收窗口,表示从本窗口的确认号算起,接收方目前允许发送方发送的数据量(以字节为单位)
- 同步SYN: 在连接建立时同步序号,SYN为1表明这是一个连接请求或连接接受报文
- 同步FIN: 释放一个连接,表明此报文的发送方数据已发送完毕,并要求释放连接
- 校验和:计算校验和会添加一个伪首部进行运算,包含源IP,目的IP,0,6,TCP长度(包括首部和数据)
UDP报文格式
- 校验和:与TCP相同,6变为17
TCP与UDP区别
- TCP是面向连接的,发送数据之前需要建立连接,UDP是无连接的
- TCP是面向字节流的,将数据看成字节流,UDP是面向报文的
- TCP提供可靠的服务,UDP尽最大努力交付,可能会有数据丢失,重复
- TCP是一对一的,UDP支持一对一,一对多,多对多
- TCP首部20-60字节,UDP首部固定8字节,但都是4字节的倍数
- TCP一般用于要求比较高的服务(FTP,HTTP,Telnet,SMTP),UDP没有拥塞控制,因此网络拥塞时发送速率不会降低(IP电话,视频会议),但可能报文会有丢失(不可靠)
如何以UDP实现可靠传输
UDP在传输层已经不可靠,只有在应用层模仿TCP实现可靠性传输,
- 添加包序号与seq,ack机制,确保数据
- 添加发送接收缓冲区与定时器,用于超时重传(根据接收到的ack删除缓冲区的数据,定时任务到了,检查是否需要重传)
- 滑动窗口实现拥塞控制