TCP伪首部只参与校验,不参与实际发送 。
文章插图
12.4.4 TCP选项字段kind(Type)LengthNameReference描述&用途01EOLRFC 793选项列表结束11NOPRFC 793无操作(用于补位填充)24MSSRFC 793最大segment长度33WSOPTRFC 1323窗口扩大系数(Window Scaling Factor)42SACK-PremittedRFC 2018表明支持SACK5可变SACKRFC 2018SACK Block(收到乱序数据)810TSOPTRFC 1323Timestamps1918TCP-MD5RFC 2385MD5认证284UTORFC 5482user Timeout(超过一定闲置时间后拆除连接)29可变TCP-AORFC 5925认证(可选用各种算法)253/254可变ExperimentalRFC 4727保留,用于科研实验12.4.5 选项格式一般Option的格式为TLV结构,如下所示:
Kind / Type(1 Byte)Length(1 Byte)Value
- EOL和NOP Option(Kind 0、Kind 1)只占1 Byte,没有Length和Value字段;
- NOP用于将TCP Header的长度补齐至32bit的倍数(由于Header Length字段以32bit为单位,因此TCP Header的长度一定是32bit的倍数);
- SACK-Premitted Option占2 Byte , 没有Value字段;
- 其余Option都以1 Byte的“Kind”开头,指明Option的类型;Length指明Option的总长度(包括Kind和Length)
- 对于收到“不能理解”的Option,TCP会无视掉,并不影响该TCP Segment的其它内容 。
文章插图
12.5 TCP状态变迁图需要熟记TCP的状态变迁图,这有助于源码阅读 。
文章插图
12.6 TCP连接与关闭12.6.1 三次握手TCP 是一个面向连接的协议 , 无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接,俗称“三次握手” 。
主要分为三个步骤:
- 第一步 :客户端向服务端发送一个 SYN报文段 (只有首部 , 且SYN被置 1),初始序号(ISN) , 假设为 A , ACK 置 0 。( 客户端进入SYN_SEND状态 )
- 第二步 :服务器端收到SYN报文段,便知道客户端需要请求握手 , 从 SYN报文段 中提取对应的信息,为该 TCP 连接分配 TCP 缓存和变量,并向该客户 TCP 发送允许连接的报文段(握手应答报文) 。这个报文段只有首部,包含3个重要的信息:( 建立客户端-->服务端的连接 )( 服务器进入SYN_RECV状态 )
- SYN与ACK标志位1
- 将TCP报文段首部的确认序号字段设置为A+1 (这个A(ISN)是从握手请求报文中得到) 。
- 服务器随机选择自己的初始序号(ISN,注意此ISN是服务器端的ISN,假设为B) , 并将其放置到TCP报文段首部的序号字段中 。
- 第三步 :客户端接收到服务器端的握手应答后 , 会将 SYN 置 0,ACK 置 1,确认序号置为B+1 , 设置窗口值 , 可以添加数据域的报文段发给服务器端 。同时给该TCP连接分配缓存和变量 。( 建立服务端-->客户端的连接 )( 客户端和服务器端都进入ESTABLISHED状态 )
文章插图
三次握手的原因:
- 避免重复连接(主要原因):参考RFC 793,主要原因是为了防止旧的重复连接引起连接混乱问题 。假设两次握手,如果由于网络原因出现SYN重传,第一个SYN请求到达后建立连接,数据交互完毕后关闭连接 , 如果此时服务器收到重传过来的SYN请求,就直接建立连接,这样会导致虚假连接 。
- 同步双方初始序列号:TCP 协议的通信双方 , 都必须维护一个序列号 。SYN请求连接的报文,需要服务端回一个ACK应答报文,表示客户端的SYN报文已被服务端成功接收,那当服务端发送SEQ给客户端的时候 , 依然也要得到客户端的应答回应,这样一来一回,才能确保双方的初始序列号能被可靠的同步 。
- 避免资源浪费:只需要三次握手即可 。
文章插图
等待2MSL的原因:
- 保证 TCP 协议的全双工连接能够可靠关闭 。
- 如果远端没有收到 ACK,触发超时重发 FIN 报文段 , 主动端依然能处理重发 ACK 。如果主动端直接 CLOSE 状态,就不能保证远端收到 ACK 。
- 保证这次连接的重复数据段从网络中消失 。
- 保证下次连接收到的数据报文段都是来自新连接的目标端 。
- 2MSL的原因:ACK到达对端最长时间是MSL,如果在ACK到达对端前 , 多对发送重传FIN , FIN过来最长时间是也MSL , 所以共2MSL 。如果等待2MSL都没有收到FIN , 就可以认为对端已经收到我们的ACK 。
推荐阅读
- vulnhub靶场之DOUBLETROUBLE: 1
- 亚索怎么玩呢(亚索大招怎么才能释放)
- 如何打好亚索(亚索的打法技巧)
- 无期迷途钻石获取途径有哪些
- 传奇九层妖塔祖玛阁怎么走(传奇祖玛阁攻略)
- 【深入浅出 Yarn 架构与实现】2-4 Yarn 基础库 - 状态机库
- 【Azure API 管理】Azure APIM服务集成在内部虚拟网络后,在内部环境中打开APIM门户使用APIs中的TEST功能失败
- DNF里浓缩的异界精髓怎么获得(浓缩的异界精髓作用)
- 小孩沉迷手机网络游戏怎么办(儿童玩手机游戏沉迷怎么办)
- 带你了解NLP的词嵌入