TCP/IP 协议族 - 运输层笔记
运输层服务
运输层负责的是进程到进程的通信。
编址: 端口号
每个进程通过一个端口号与其他进程通信。
套接字地址
TCP协议族的运输层协议在建立连接时,需要在连接的两端同时使用IP地址和端口号。这样的组合就成为套接字地址 (socket address)。 套接字地址唯一地定义了一个进程。
流量控制
差错控制
运输层差错控制负责:
- 检测并丢弃损坏的分组。
- 跟踪丢失和丢弃的分组并重传。
- 识别重复的分组并丢弃。
- 保存失序到达的分组,直到缺失的分组全部抵达。
拥塞控制
开环拥塞控制
在拥塞发生之前采取一些策略来预防拥塞称为开环拥塞控制,包括:
- 重传策略。好的重传策略可以预防拥塞。
- 窗口策略。
- 确认策略。接收方可以再自己有分组要发送,或者一个特殊的计时器到期时才发送一个确认。
闭环拥塞控制
在拥塞后缓解拥塞的程度。
无连接和面向连接的服务
当使用无连接的服务时,应用程序将豹纹分割成大小可被运输层接受的数据块,并交付给运输层。运输层将这些数据块视为独立的数据单元,块和块之间没有联系。 因为分组上没有编号,所以一旦报文失序或者丢失,便不能组合。
面向连接的服务
数据交换只能在建立连接之后发生。
运输层协议
简单协议
最简单的一个发送一个接受。
停止等待协议
发送方和接收方都有一个大小为1的窗口,每次接受都要确认。如果超时了就重传。 在停等协议中,流量控制通过迫使发送方等待确认实现,差错控制通过丢弃损坏分组并让发送方超时重传实现。
序号
只需0、1两个序号。
返回 N 协议
发送发窗口大小$2^m-1$,接受方大小1。 接收方期望序号顺序到达,否则丢弃分组并发送一个 ACK。
发送窗口大小
该协议中窗口大小为$2^m-1$。 考虑这么一种情况,如果窗口大小为$2^m$,那么发送$2^m-1$个分组,他们的确认全部丢失,那么接收方肯定会发送一个 ACK = 0。 这时候是发送新的0还是旧的0呢? 所以就产生了歧义。
选择重传协议
接受方缓存收到的分组。先储存下来,如果收到一个 seqNo = Rn 的分组,就把连续的分组全部交付给应用层。 发送方发送分组,如果收到一个 ackNo = Sf 的分组,把窗口右移,直到指向第一个未 ack 的序号。
确认
这里的 ACK 语义不同,代表只收到了某个分组。
窗口大小
窗口大小最大为$2^{m - 1}$。
考虑下面这种情况: 假设窗口大小为$2^{m-1}+1$,现在发送方发送了$2^{m-1}$个分组,确认全部丢失。 这时候接收方的窗口是包括0的。 然后发送方又重发了$0 \dot 2^{m-1}$,这时候的0显然是旧的0,却被当成是新的了。
捎带技术
ACK 可以不马上回复,等有数据传输的时候捎上去。
- 上一篇 Reids 源码阅读 - SDS
- 下一篇 Redis 源码阅读 - 链表