TCP学习-1
TCP学习(一)
TCP只对含有数据的ACK进行确认【发端超时重传】;单独的ACK不会发送不会设置超时定时器
- 因此TCP要考虑每个阶段中可能出现的ACK丢失的情况!!!
报文类型
通过头部的控制位(6bit)区分不同的报文类型:
- SYN报文:用于建立连接,包含SYN标志 -> 需要占用一个序号;其中包含最大报文段长度信息,且该信息只能出现在SYN中
- ACK报文:用于确认接收到的数据,包含ACK标志 -> 为1时,4Bytes的确认序号字段才有有用;连接一旦建立,该位总是被置为1
- FIN报文:用于结束连接,包含FIN标志 -> 需要占用一个序号,发端完成发送任务
- RST报文:用于重置连接,包含RST标志
- PSH报文:用于推送数据,包含PSH标志 -> 接收方应尽快把这个报文段交给应用层
- URG报文:用于紧急数据,包含URG标志
- 数据报文:包含实际的数据,不包含任何控制位
连接建立、终止,超时处理过程中涉及到的报文,大多都是不带数据的报文【控制报文】
最大报文段长度(MSS)信息【首部可选项】,只能出现在SYN中;该信息是沟通双方可以协商确定的;为了不在IP层产生分片,MSS最大为1460(RFC以太网)
报文首部
- 序号:标识从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的的第一个数据字节。是32bit的无符号数,序号到达2^32-1后又从0开始;
- 那么该条报文数据字段包含的序号范围就是可以计算的了 -> 根据数据负载的长度
分片机制
- 注意IP层是有分片机制的
- IP头部指示总长度的字段占16bits,因此IP报文最大长度为65535Bytes;
- IP只有针对首部的校验和
- TCP也是有分片机制的:而且一般需要将TCP每帧报文长度控制在IP层MTU范围以内,防止产生IP层分片 -> √
- TCP报文的长度有限制吗?有长度指示域嘛? -> 首部没有长度指示位域
- TCP的校验和覆盖首部和数据:且收端检测到校验和时,不会确认接收该报文,等待发端触发超时重传
- 有IP层分片也可以,只是如果某个IP片丢失后,整个IP报文都会被丢弃,进而导致上层协议重传一整个丢失的报文
- 如果使用上层的分片机制,可以将长数据报文分割成多个小的片段;当某一个小的片段丢失后,只需要重传那个丢失的分片报文就可以
IP层路由
- 需要注意主机IP地址由网络号,子网号和主机号组成,且主机号不能为0
- 网络号,主要由A,B,C等几类地址而来
- 子网号,针对每一个特定的网络号,可以划分为很多子网
- 主机号,该子网内的所有真实主机的IP
IP层从某个网络接口接收到报文
- 如果该IP报文的目的地址为本机IP地址之一【本机可能有多个IP地址】或者为IP广播地址,则将该IP报文上传给由IP首部协议字段指定的上层协议模块进行处理
- 否则,
- 如果机器没有IP路由功能,则将该IP报文丢弃
- 如果该机器开启了IP路由功能,则对报文进行转发【类似于本机器发出IP报文】
- 匹配路由表顺序【IP报文的目的地址与路由表的目的地址字段】:
- 全匹配:
- 网段匹配:
- 默认条目
- 如果以上都不能匹配成功,那么数据包就不能被传送:
- 如果该数据报是本机发送的,那么一般IP层会向发送该数据报的上层应用通知:“主机不可达”或者“网络不可达”
路由表内容
- 目的IP地址:可以为主机地址,也可以为网络地址【网段地址】
- 下一跳路由器【有直接网口相连的主机】的IP地址:
- 标志:1. 目的地址是网络地址还是主机地址;2. 下一跳为路由器,还是有直接网口相连的主机
- 为数据报的发送指定一个网络接口【卡】,即数据报文将从本机的哪一个网络接口发送出去
RST报文使用场景
- 到不存在端口的连接请求
- 异常终止一个连接:可以发送RST而不是FIN来中途释放一个连接
- 检测半打开连接
TCP学习-1
http://example.com/2024/07/22/TCP学习-1/