TCP/IP基础01:TCP连接管理

本文深入解析TCP/IP协议的连接管理机制,包括三次握手、四次挥手的原因,TCP状态转换过程,TIME_WAIT状态的作用及TCP_OPTION在握手数据交换中的应用。探讨TCP连接建立与终止的细节,揭示其背后的网络传输原理。

TCP/IP基础01:TCP连接管理

0 TCP头

在这里插入图片描述
TCP头不加Option占用20个字节(32×5 bit)。

  • Sequence Number表示自己发出去的序列号。

  • Ack Num表示对别人序列号的回复。

  • TCP_Checksum原理与实现
    https://blog.youkuaiyun.com/qq_15437629/article/details/79183076

  • PSH
    PSH是TCP报头中的一个标志位,发送方在发送数据的时候可以设置这个标志位.当两个应用程序进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应.在这种情况下,TCP可以使用推送(push)操作.这时,发送端TCP将推送比特PSH置为1,并立即创建一个报文段发送出去.接收TCP收到推送比特置1的报文段,就尽快地(即"推送向前")交付给接收应用进程,而不再等到整个缓冲都填满了再向上交互.PSH比特也叫急迫比特.

1 TCP连接管理

1.1 TCP的连接建立与终止

其中ACK+1表示的是,下一次期望得到的包的序号。
在这里插入图片描述
  使用Wireshark抓包,三次握手图片如下图所示。TCP的头部的8位bit可以叠加使用。
  wireshark中使用一般默认启用相对序号(relative sequence number)。所以看到的序号是从1开始的,可以在edit-preference-protocols-TCP里面设置。
  每一个序列号对应着一个Byte,所以第一个包是seq_1:101 len_1:100的话,那么下一个包的seq_2 = seq_1 + len_1=201。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Q:为什么TCP要三次握手四次挥手?

1、三次握手
TCP握手时,完成的是对序列号的交换。
1次握手,那么发送方不会知道是否握手成功,也没有交换到序列号。所以不可以。
2次握手,发送方发送syn+seq,接受方回复syn+seq+ack。此时接受方并不知道发送方没有收到ack。如果此时的请求发出的syn由于延时并没有及时到接受方,便重传syn,建立连接后,第一次发的syn又被接收方收到,此时便建立了两个连接,第一个是无效的。并不能保证数据传输的可靠
4次握手,发送方和接收方分别发送
  syn+seq,
        ack,
        syn+seq,
  ack
但是其中接受方的ack和syn可以合并到一起,这样就可以保证传输效率
2、四次挥手
  四次挥手时,可以将接收方的ack+fin合并到一起啊,为什么这里不合起来发呢?
  因为TCP连接是双向传输的对等的模式,就是说双方都可以同时向对方发送或接收数据。当有一方要关闭连接时,会发送指令告知对方,我要关闭连接了。这时对方会回一个ACK,此时一个方向的连接关闭。但是另一个方向仍然可以继续传输数据,等到发送完了所有的数据后,会发送一个FIN段来关闭此方向上的连接。接收方发送ACK确认关闭连接。注意,接收到FIN报文的一方只能回复一个ACK, 它是无法马上返回对方一个FIN报文段的,因为结束数据传输的“指令”是上层应用层给出的。
   一句话来说就是由于TCP双向传输数据,一方结束时,另一方有可能还要发送数据,所以此处不能直接发送ack+fin来把另一个方向也关闭掉。
  这个问题其实是两军对垒的问题,并没有100%有效的方式。
  部分参考自《wireshark网络分析就这么简单》

1.2 TCP状态转换

在这里插入图片描述

其中分为开启、数据传输、关闭三个部分。

开启分为主动开启、被动开启和同时开启。由CLOSED 进入LISTEN状态为被动开始,进入SYN_SENT为主动开启。

数据传输为ESTABLISHED状态。

关闭分为主动关闭、被动关闭和同时关闭。

1.2.1 TIME_WAIT状态(2MSL) 目的

TIME_WAIT状态的存在有两个理由:(1)让4次握手关闭流程更加可靠;4次握手的最后一个ACK是是由主动关闭方发送出去的,若这个ACK丢失,被动关闭方会再次发一个FIN过来。若主动关闭方能够保持一个2MSL的TIME_WAIT状态,则有更大的机会让丢失的ACK被再次发送出去。(2)防止lost duplicate对后续新建正常链接的传输造成破坏。
lost duplicate在实际的网络中非常常见,经常是由于路由器产生故障,路径无法收敛,导致一个packet在路由器A,B,C之间做类似死循环的跳转。IP头部有个TTL,限制了一个包在网络中的最大跳数,因此这个包有两种命运,要么最后TTL变为0,在网络中消失;要么TTL在变为0之前路由器路径收敛,它凭借剩余的TTL跳数终于到达目的地。但非常可惜的是TCP通过超时重传机制在早些时候发送了一个跟它一模一样的包,并先于它达到了目的地,因此它的命运也就注定被TCP协议栈抛弃。另外一个概念叫做incarnation connection,指跟上次的socket pair一摸一样的新连接,叫做incarnation of previous connection。lost duplicate加上incarnation connection,则会对我们的传输造成致命的错误。大家都知道TCP是流式的,所有包到达的顺序是不一致的,依靠序列号由TCP协议栈做顺序的拼接;假设一个incarnation connection这时收到的seq=1000, 来了一个lost duplicate为seq=1000, len=1000, 则tcp认为这个lost duplicate合法,并存放入了receive buffer,导致传输出现错误。通过一个2MSL TIME_WAIT状态,确保所有的lost duplicate都会消失掉,避免对新连接造成错误。

1.3 TCP_OPTION(TCP握手数据交换)

发送端发送的SYN如下图所示,其中表明了
1)最大的段的大小(MSS) 1460Byte。表示发送者可以接受到的报文段的最大值。(接受缓冲区的大小)
其中大多数网络单元的MTU是1500 Byte,如果启用了巨帧那么可以达到9000 Byte。1460 Byte = 1500- 20 -20。=
2)SACK支持
3)时间戳
4)window scale。TCP的缩放系数为2的7次方(128)。通过和win size value相乘可以得到发送端自己的窗口大小。
滑动窗口
在这里插入图片描述
接受端发送的SYN+ACK如下图所示,
其中接收端的缩放系数为2的8次方(256)。
在这里插入图片描述

2 TCP连接相关攻击

未完待续。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值