1. 背景介绍
TCP 是数据传输层,这一块是网络协议的核心,只有了解这一块,才能够知道实际数据流是怎么走的。网络世界里面纷繁复杂的事情存在。
1.1 TCP的基本架构
2. TCP 哪些事,查看
2.1 TCP 的内容/结构
- Source Port是源端口,16位。 (2个字节) TCP首部 TCP首部
- Destination Port是目的端口,16位。(2个字节)
- Sequence Number是发送数据包中的第一个字节的序列号,32位。 (4个字节)
- Acknowledgment Number是确认序列号,32位。 (4个字节)
- Data Offset是数据偏移,4位,该字段的值是TCP首部(包括选项)长度除以4。[1] (2字节)
- 标志位: 6位,URG表示Urgent Pointer字段有意义:
- ACK表示Acknowledgment Number字段有意义
- PSH表示Push功能,RST表示复位TCP连接
- SYN表示SYN报文(在建立TCP连接的时候使用)
- FIN表示没有数据需要发送了(在关闭TCP连接的时候使用)
- Window表示接收缓冲区的空闲空间,16位,用来告诉TCP连接对端自己能够接收的最大数据长度。(2字节)
- Checksum是校验和,16位。(2字节
- Urgent Pointers是紧急指针,16位,只有URG标志位被设置时该字段才有意义,表示紧急数据相对序列号(Sequence Number字段的值)的偏移。(2字节)
- offset :所以用偏移量来计算整个TCP报头的长度,偏移量每增加1, 报头长度增加4字节
3. TCP的机制和原理
3.1 TCP是怎么来发包和接收包,保证其可靠性?
- 会在最后的包进行确认,如接收到699个包,会ack =700
3.1.1 遇到丢包问题?重传机制
- 超时重传机制
- 一种是仅重传timeout的包。也就是第3份数据。
- 另一种是重传timeout后所有的数据,也就是第3,4,5这三份数据
- 快速重传机制: 解决多份数据确认的问题,不以时间驱动,而以数据驱动重传。只要数据没有到就一直等确认,如果超过3次就自动重传
- Duplicate SACK – 重复收到数据的问题: 对于已经收到的包作为标识,如果有重复的包来了,回复D-SACK确认号
- TCP的RTT算法:解决超时重传的时间问题
- 经典算法: 记录最近几次的RTT时间,进行加权平均。 并得到重传时间的区间(对于大的网络抖动的问题,很容易平滑掉了)
- jacobson , 这个算法引入了最新的RTT的采样和平滑过的SRTT的差距做因子来计算。
3.2 TCP滑动窗口(Window)
我们都知道,TCP必需要解决的可靠传输以及包乱序(reordering)的问题,所以,TCP必需要知道网络实际的数据处理带宽或是数据处理速度,这样才不会引起网络拥塞,导致丢包。(调整发送包大小的,调整期,会根据宽带的数据和网络的情况,综合计算出需要发送包的大小,类似流量控制作用)
- 缓冲区分为四类:1.发送+确认 , 2. 发送+未确认 , 3. 待接受者接受数据, 4. 未发送也还不准备接受者接收。
- 拥塞控制主要是四个算法:1)慢启动,2)拥塞避免,3)拥塞发生,4)快速恢复。这四个算法不是一天都搞出来的,这个四算法的发展经历了很多时间,到今天都还在优化中。