TCP协议详解一:连接特点、可靠性如何保证及首部格式
1. tcp连接的特点
- 提供面向连接的,可靠的字节流服务
- 为上层应用层提供服务,不关心具体传输的内容是什么,也不知道是二进制流,还是ascii字符。
2. tcp的可靠性如何保证
- 分块传送:数据被分割成最合适的数据块(UDP的数据报长度不变)
- 等待确认:通过定时器等待接收端发送确认请求,收不到确认则重发
- 确认回复:收到确认后发送确认回复(不是立即发送,通常推迟几分之一秒)
- 数据校验:保持首部和数据的校验和,检测数据传输过程有无变化
- 乱序排序:接收端能重排序数据,以正确的顺序交给应用端
- 重复丢弃:接收端能丢弃重复的数据包
- 流量缓冲:两端有固定大小的缓冲区(滑动窗口),防止速度不匹配丢数据
3. tcp的首部格式
3.1 宏观位置
- 从应用层->传输层->网络层->链路层,每经过一次都会在报文中增加相应的首部。参考之前的文章http协议
- TCP数据被封装在IP数据报中
3.2 首部格式
- tcp首部数据通常包含20个字节(不包括任选字段)
- 第1-2两个字节:源端口号
- 第3-4两个字节:目的端口号
源端口号+ip首部中的源ip地址+目的端口号+ip首部中的目的ip地址,唯一的确定了一个tcp连接。对应编码级别的socket。
- 第5-8四个字节:32位序号。tcp提供全双工服务,两端都有各自的序号。编号:解决网络包乱序的问题
序号如何生成:不能是固定写死的,否则断网重连时序号重复使用会乱套。tcp基于时钟生成一个序号,每4微秒加一,到2^32-1时又从0开始
- 第9-12四个字节:32位确认序列号。上次成功收到数据字节序号加1,ack为1才有效。确认号:解决丢包的问题
- 第13位字节:首部长度。因为任选字段长度可变
- 后面6bite:保留
- 随后6bite:标识位。控制各种状态
- 第15-16两个字节:窗口大小。接收端期望接收的字节数。解决流量控制的问题
- 第17-18两个字节:校验和。由发送端计算和存储,由接收端校验。解决数据正确性问题
- 第19-20两个字节:紧急指针
3.3 标识位说明
- URG:为1时,表示紧急指针有效
- ACK:确认标识,连接建立成功后,总为1。为1时确认号有效
- PSH:接收方应尽快把这个报文交给应用层
- RST:复位标识,重建连接
- SYN:建立新连接时,该位为0
- FIN:关闭连接标识
3.4 tcp选项格式
- 每个选项开始是1字节kind字段,说明选项的类型
- kind为0和1的选项,只占一个字节
- 其他kind后有一字节len,表示该选项总长度(包括kind和len)
- kind为11,12,13表示tcp事务
3.5 MSS 最长报文大小
- 最常见的可选字段
- MSS只能出现在SYN时传过来(第一次握手和第二次握手时)
- 指明本端能接收的最大长度的报文段
- 建立连接时,双方都要发送MSS
- 如果不发送,默认为536字节
作者:kinnylee
来源:掘金
THE END