传输层
传输层
概述
- 传输的信息称为TPDU,也称数据段segment
- 传输层利用网络层的服务,为它的上层应用层提供服务
- 传输层提供的是高效的,可靠的数据传输技术
- 网络层是将数据从主机传递到主机,而传输层则是将数据送到具体的应用进程,为端点到端点,通过端口号定位到具体的进程
- 一个端点为一个套接字,用(IP地址,端口号)的二元组,端口号用16位二进制表示
- 主要包含两个协议:UDP和TCP
通信五元组
- 源IP
- 源端口
- TCP或UDP等传输协议
- 目的IP
- 目的端口
用户数据包协议UDP
- 无连接的传输协议,无需建立连接
- 传输的是数据段
- 不是可靠的数据传输,不提供差错控制和可靠传输;但简洁高效
- DNS使用的是UDP
UDP数据段:8字节的头部+数据
- 比IP好的地方在于使用了源端口和目的端口
- 在计算时,需要用到IP地址,破坏了分层的原则
- UDP数据段头
- source port:源端口,16位
- destination port:目的端口,16位
- UDP length:长度字段,头部和数据有多少字节
- checksum:校验和,若不计算校验和,则该字段设为0
- 校验和计算:如果收方的校验和为全1,则传输无错
- IP伪头部计算
TCP
- 提供可靠的数据流传输
- 面向连接的
- 以数据段的形式交换数据
TPU数据段:20字节头部+数据
- 源端口+目的端口
- 序列号:32位序列号;初始序列号随机产生;为每个字节编号
- 确认号:32位,期望接收的字节号;保证TCP的可靠传输;ack=500,则下次从501开始发数据(累计确认技术)
- TCP段头长度
- 控制比特:1位进行表示
- URG:紧急指针有效,必须立即处理,如ctrl+C
- ACK:1表示确认号有效,0表示确认号无效
- PSH:表示带有PUSH标志的数据,直接送到上层,不需要缓存
- RST:重置一个混乱的连接
- SYN:用于连接建立的过程,与ACK配合使用;SYN=1,ACK=0表示连接建立请求;SYN=1,ACK=1表示接受连接请求
- FIN:用于释放连接,表示发送方已经没有数据要传输了,但是可以继续接受数据
- 窗口尺寸:表示对方可以发送的数据字节数(从确认字节号开始,连续发送的字节总数),用于TCP的流量控制
- 校验和:类似UDP协议,只是IP伪头部计算稍有不同
- 紧急指针:与URG配合使用
TCP三次握手建立连接
- server被动等待一个连接请求,client发送连接请求
- 服务器方回发确认应答
- 应答到达请求方,请求方最后确认,连接建立
- 三次握手是同步的过程,双方可以互相收发数据,双方交换初始序列号,保证后序的每一个字节的可靠传输
TCP连接释放:四次挥手
- 一方发送连接释放请求DR(disconnect request),且期待对方的ACK
- DR到达接收端,它回发ACK,并且另外发送一个DR
- 当ACK到达发送端时,连接释放;同时它回发确认ACK,当这个ACK到达接收端,反方向的连接也释放了
- 为避免DR和ACK丢失而引发的问题,采用了定时器:任何时候在发出DR的同时,启动一个定时器,如果超期未收到应答则释放连接,另一方最终会注意到连接的对方已经不在了,超时后连接释放
- 当初始DR和重传都丢了,发送者会释放连接,但另一端却不会,仍处于活跃状态,导致半开放连接
- 杀死半开放连接:如果在一定时间内没有TPDU到达的话,连接自动释放;在发送一个TDPU时也启动定时器,当定时器超期,则发动一个哑TPDU,以避免被断掉
TCP传输策略
- 通过window字段进行流量控制
- 当window=0时,说明接收方缓存已满,不能够继续收数据了;除非为URGENT信号,或者发送一个字节的数据段,以便让接收者再次发送窗口号,避免死锁
- 优化接收端:延迟回复,将多个回复信息放入一个数据段中;clark方案避免接收方缓存一直处于满的状态(即接收方的缓存有一定的空余时,才发送窗口更新数据)
- 优化发送端:nagle算法:在第一个数据段先发送第一个字节,然后缓存剩下多个字节到下一个数据段,依次执行;而不是一个字节一个字节发一个数据段
TCP拥塞控制
拥塞的根源:网络的容量(拥塞窗口表示)、接收者容量(接收者窗口表示)
- 接收者窗口:接收者的瓶颈
- 拥塞窗口:网络中的瓶颈,通过慢启动算法确定(逐次加倍数据段大小,直到超时)
- 阈值:当拥塞窗口超过阈值时,不再按指数增长,而是线性增长;当超时时,将阈值设为当前拥塞窗口的一半,重新从1开始增大拥塞窗口或者从阈值大小开始线性增长
TCP定时器
- 重传计时器:当计时器超时,认为包丢失,重新发送
- 持续定时器:接收方发送更新窗口的数据段丢失,产生了死锁,两者互相等待;使用持续定时器定时发送探索数据段,避免死锁
- 保活定时器:用来检查连接是否存活,超期则杀掉连接