计算机网络-传输层
三月 01, 2021
传输层功能
- 为相互通信的进程提供了逻辑通讯
- 对报文进行差错检测
- 提供面向连接和无连接服务
传输层协议
- TCP协议(用户数据报协议)
- 传输的数据需要分段
- 建立会话
- 可靠传输
- 流量控制
- UDP协议(用户数据报协议)
- 一个数据包就可以完成通信
- 不建立会话
- 不需要流量控制
- 不可靠传输
IP与端口号
- IP地址用于定位服务器
- 端口号用于定位进程服务
- 一共由0-65535端口号
- 0-1023为熟知端口
- 1024-49151为登记端口
- 49152-65535为客户端端口
UDP协议
特点
- 无连接,发送数据前不需要建立连接
- 使用最大努力交付,不保证可靠传输,不使用拥塞控制
- 面向报文
- 支持一对一、一对多、多对一、多对多的交互通信
- 首部开销8个字节
UDP首部格式
首部中校验和的计算需要网络层首部中12个字节参与,因为这部分不属于传输层中,所以也叫伪首部。
TCP协议
特点
- 面向连接(三次握手)
- TCP连接仅支持点对点通信
- TCP提供可靠交付服务
- TCP提供全双工通信
- 面向字节流
TCP首部格式
- 序号:数据的第一个字节位于整个文件的多少字节位置
- 确认号:告诉对方下一次发送整个文件的多少字节位置的数据
- 数据偏移:TCP首部的长度不固定,所以这个参数用来说明数据需要偏移多少位
- URG:是否优先传输,不需要排队
- ACK:确认号是否有效
- PSH:接受时优先接受
- RST:TCP会话出现错误,需释放再重连
- SYN:建立会话的标志
- FIN:结束会话标志
- 窗口:控制窗口的大小,处理缓存的上限
- 紧急指针:URG为1时有效,表明紧急数据在数据中的字节位置
- 选项:
- 可以规定最大数据报(MSS)的大小
- 可以规定是否支持选择性确认
- 最长40个字节
TCP的点对点连接
TCP连接的两个端点不是主机,不是IP地址,不是应用程序,也不是协议端口号。
而是套接字socket
socket = ip + port
TCP如何确保可靠交付
- 停止等待协议(缺点:信道利用率低下)
- 自动重传请求ARQ协议(优化信道利用率)
停止等待协议
无差错情况
超时重传情况
确认丢失情况
确认迟到情况
连续ARQ协议
当收到ACK确认后,窗口便往后移动
积累确认
- 不需要每一个都确认,当我们收到确认③时,说明①②也收到了
- 但是这个导致重复发送
举个栗子:
- 发送①②③④,③在途中丢失了
- 收到返回的②的确认后,却收不到③的确认
- 重发③④过去,其中④重复发送
窗口控制
以字节为单位的滑动窗口技术
当接受到确认报后,发送端才会移动发送窗口,并从缓存中删除确认过的数据
若中途有数据包丢失,根据确认号以及选择性确认,重发丢失的数据包
超时重传时间的选择
新RTTs = (1 - α) * (旧RTTs) + α * (新的RTT样本)
RTTs:加权平均往返时间
α:平滑因子,推荐为1/8
- α增大,修正幅度增大,适用于变化较大的网络中
- α减大,修正幅度减小,适用于变化较小的网络中
RTT样本:当前往返时间
TCP如何实现流量控制
每次确认包都可以调整当前窗口的大小
当窗口调整到零时,通信就会停止
注意:停止的时候发送方也会定期发送窗口测定数据包,确保对方仍在线
接收方需要发送一个确认包调整窗口大小,通信才能继续开始
TCP如何实现拥塞控制
出现拥塞的条件:对资源需求的总和 > 可用的资源
原理:发送方会维护着一个拥塞窗口
慢启动
cwnd = [1,2,4,6,8,16]
- 收到确认包后,
cwnd
会指数增长 - 当
cwnd
达到16后,每次只会增长1 - 直至收不到确认包(发生阻塞)
- 当发生阻塞时,
cwnd
增长的上限变为发生阻塞时cwnd
的1/2 - 并且cwnd又从1开始增长
注意:慢启动并不是意味着不可能发生网络拥塞,只是按线性增长,使得网络比较不容易拥塞
快重传
- 当发送方收到接收方3个确认包中确认号时相同的,直接重发确认号的数据包
快恢复
cwnd
变为发生阻塞时cwnd
的1/2并以加1的速度增长
发送方的发送窗口应该为Min[接收方接受窗口,发送方发送窗口,拥塞窗口]
拥塞控制&流量控制的区别
- 拥塞控制:是一个全局过程,涉及到全网络中的所有主机,所有路由以及与降低网络传输性能有关的所有因素。
- 流量控制:往往只存在于给定的发送端和接收端之间的点对点通信量控制,所做的事情便是抑制发送端发送数据的速率,以便接收方来得及接受。
TCP传输连接管理
- 三大阶段:连接建立、数据传输、连接释放
- 连接方式:客户端/服务器方式
连接的建立
第三次握手的必要性:
- 原因①:确保服务器发送能力正常
- 原因②:
- 防止第一个挥手超时,发送第二次
- 确认第二次握手包后,又收到第一次握手包,
- 再确认一次,但客户端已经接受到第一次确认包,所以不搭理
- 但服务端却开辟着资源等待发送端的数据传输,造成了开销浪费
连接的释放
默认1MSL = 2分钟
2MSL存在的意义是防止最后一个包丢失
查看评论