一. 传输层的作用
网络层(IP)中有标识, 确定是TCP还是UDP, 传输层用来确定数据是传递给哪个应用
UNIX中会有守护进程, 收到请求后, 会转换成hrrpd, sshd等守护进程, 然后根据端口号, 传递给相应的应用
二. 端口号
也叫程序地址, 不同协议可以使用相同的端口号, 比如TCP和UDP可以同时使用8080这个端口号
2.1 标准端口号
2.2 静态端口号
三. UDP
3.1 UDP适合场景
面向无连接的协议如:
四. TCP
4.1 有连接的通讯协议
4.2 TCP特点
TCP通过校验和, 序列号, 确认应答, 重发控制, 连接管理, 窗口控制等实现了可靠传输
4.3 确认应答和序列号提高可靠性
4.3.1 确认应答(ACK)
- 正常情况

- 丢包

- 应答丢失
4.3.2 序列号
确认应答丢失, 发送端会重复传送, 接收端通过序列号确认是否为重复发送, 如果是重复发送, 就弃包
4.4 重发超时的确定
不同距离, 不同网络, 不同网络拥堵情况, 包相应时间不一致
Unix和Win10超时时间为0.5秒倍数, 最初数据包还不知道往返时间, 一般为6秒, 后续如果还收不到, 就按照2倍, 四倍时间延长, 达到一定次数, 就取消超时重试
通过后续时间, 计算时间, 超时重试时间略大于每次发包往返时间4.5 连接管理
建立TCP连接需要发送3个包, 三次握手, 一次连接的创建和断开, 来回至少需要7个包才能完成
4.6 TCP以段为单位发送数据(MSS)
Maximum Segment Size ,最大消息长度, 会在三次握手的时候写入
4.7 利用窗口控制提高速度
每次发一个数据, 就有一次确认操作, 确认应答回来后, 据需发送, 包的往返时间越长, 通讯性能越低
窗口控制如下, 一个窗口四个段, 数据发送后, 不等确认应答, 继续发送, 每4个段确认一次, 再发包
这个机制需要更大的缓存区保存发送包, 方便重发, 如果其中某个数据已经确认, 就不需要重新发送, 可以从缓存中清楚数据, 这种机制也叫滑动窗口
4.8 窗口控制与重发控制
当有窗口之后, 有些情况, 即便确认应答丢失, 也无需重发, 因为有多个确认应答返回, 确认应答会表示下一个偏移量
根据偏移量, 确认是否需要重发
丢失也不需要重发场景
如果三次出现同一个偏移量的确认应答, 就重发
4.9 流量控制
接收端可能在收到一个毫无关系的数据包上, 处理花费一定时间, 也有可能在高负载的情况下, 无法接受任何数据, 导致接受端把一些本应该接收的数据丢弃, 会导致网络流量浪费
接收端会根据当前接收端实际能力, 调整窗口大小(TCP的首部会包含一个窗口大小通知)
如果窗口变更通知丢失, 可能导致无法继续通讯
所以发送端会时不时发送窗口探测数据段, 数据段只有1byte, 用来获取窗口大小信息
4.10 拥塞控制
慢启动, 一开始窗口设置为1个段, 之后每次收到确认应答, 拥堵窗口的大小设置就加一, 在发送数据包时候, 将发送端和接收端的窗口进行对比, 选择较小的那个值, 有了上诉方案, 可以避免网络拥塞的情况, 随着包的每次往返, 拥塞窗口会按照1,2,4等指数增长
4.11 提高网络利用率规范
4.11.1 Nagle算法
- 已经发送数据都收到确认应答
- 可以发送最大段长度时候
满足以上两个条件时候才发送数据, 在自动控制领域, 会关闭该算法
4.11.2 延迟确认应答
- 没有收到两倍最大数据段不应答, 有的操作系统是收到两个包应答
- 延迟0.5秒应答, 很多操作系统是0.2秒
事实上, 因为滑动窗口机制, 少一些应答也没有问题, TCP文件传输中, 绝大多数是每两个数据段, 返回一次确认应答
4.11.3 捎带应答
有些协议SMTP, POP, FTP等
比如远程登录会对输入的字符回送校验
可将确认应答和回执数据在一个包发送
4.12 TCP首部

- 序列号32位
每发送一次, 就累加一次数据 - 确认序列号
下一次应该收到数据序列号, 实际是收到确认应答号减1为止的数据,发送端收到可确认数据收到 - 数据偏移
数据段的偏移量 - 保留
后期扩展用 - 控制位
- CWR
- ECE
- URG
- ACK
- PSH
- RST
- SYN
- FIN
- 窗口大小
- 校验和
- 经济指针
- 选项

