从TCP报文理解三次握手

阅读目标

  1. 了解TCP协议报文格式
  2. 了解三次握手具体细节

TCP报文

报文一般分为两部分:报头和数据(如下图)。下面我们分析一下TCP协议的报头都包含着哪些信息。

Source Port(源端口)/Destination Port(目标端口)

IP协议上的ip地址指定要连接的是哪两台机器,TCP协议的这两个端口指定要连接的是这两台机器上的哪个服务。举个栗子: A给B发微信消息,ip地址让网络知道是A的电脑和B的电脑要通讯,而端口则让网络知道是A的电脑上的微信和B电脑上的微信在通讯, 而不是A电脑的qq和B电脑qq在通讯。

Sequence Number(拆包序列号)

在网络传输中,当数据量过大时,发送端(包括客户端发送和服务端发送) 会对数据进行拆包,接收端每次做响应时(告知发送端已收到数据),都是通过ack number告知下次我要接收的数据编号,该编号就是Sequence Number,计算方式为发送端的seq加上数据length三次握手会用到

Acknowledge Number(回应序号)

ACK flag 置 1 时才有效,指接收方期待的下一个报文段的序列号,计算方式为发送端的seq+数据length。三次握手会用到

Data Offset(数据偏移量)

其实就是TCP头部长度,可以理解为TCP首部占32bit字节的数目(可以按照上图理解为占了几行)

  1. 本身为4位,能表示的二进制最大数为1111,换算成十进制为15,而且因为上图每一行是4个字节,所以TCP头部最大为最大长度为15*4=60个字节
  2. 在上图中因为除了Options和Pading部分其他都是必须的,所以TCP头部最小为为5*4=20个字节

Reserved(保留字段)

未使用的保留字段

Code(Control Flag控制标志码)

当我们在进行网络联机的时候,必须要说明这个联机的状态,好让接收端了解这个封包的主要动作。 这可是一个非常重要的句柄。这个字段共有 6 个 bits ,分别代表 6 个句柄,若为 1 则为启动。分别说明如下:

  1. URG(Urgent):若为 1 则代表该封包为紧急报文, 接收端应该要紧急处理。后面的Urgent Pointer 字段也会被启用。

  2. ACK(Acknowledge):若为 1 代表这个封包为响应报文, Acknowledge Number会被赋值。三次握手会用到

  3. PSH(Push function):若为 1 时,代表要求对方立即传送缓冲区内的其他对应报文,而无须等待缓冲区满了才送。

  4. RST(Reset):如果 RST 为 1 的时候,表示联机会被马上结束,而无需等待终止确认手续。这也就是说, 这是个强制结束的联机,且发送端已断线。四次挥手会用到

  5. SYN(Synchronous):若为 1,表示发送端希望双方建立同步处理, 也就是要求建立联机。通常带有 SYN 标志的封包表示『主动』要连接到对方的意思。三次握手会用到

  6. FIN(Finish):若为 1 ,表示传送结束,所以通知对方数据传毕, 是否同意断线,只是发送者还在等待对方的响应而已。四次挥手会用到

Window(滑动窗口)

滑动窗口

Checksum(确认检查码)

当数据要由发送端送出前,会进行一个校验的动作,并将该动作的检验指标注在这个字段上。而接受者收到这个报文后,会再次的对报文进行验证,并且对比原发送的checksum值是否相符,如果相符合就接受,若不符就会假设该包已经损毁,进而要求对方重新发送此报文。checksum这种校验非常弱,规则都是透明的,所以不要相信这个校验和可以帮你防止恶意篡改,它仅仅用来应对网络传输中的干扰信号

Urgent Pointer(紧急指针)

这个字段是在Code内的URG=1时才会产生作用,可以告知紧急数据所在的位置

Options(任意资料)

目前这个字段仅仅用于表示TCP协议最大分段容量,即MSS((Max Segment Size))。这个字段用于在第一次和第二次握手告知对方自己能够接收的最大分段容量,如果不设置,则代表没有限制。

Padding(补足字段)

Options和Padding一共有32位,由于Options字段不是固定的,所以需要Padding 字段来加以补齐

三次握手流程

在这里插入图片描述
在两台机器建立联机之前要通过三个确认动作(D不属于确认动作),该动作被称为三次握手(Three-way-handshake),整个流程如下:

A: 报文发起

当客户端想要对服务器联机时,客户端随机取用一个大于1024以上的端口向服务器发送一个报文,在此报文中,CODE字段中的SYN位要标记为1,并且生成一个随机的序号Sequence number,假设此时该值为10001。

报头信息: SYN=1 seq=10001

B: 报文接收与确认报文传送

当服务器接收到这个报文,并且确定要接收这个报文后,会向客户端发送一个报文,该报文做了如下两件事:

  1. 告知客户端已经收到您的信息
    将CODE字段中的ACK置为1,并且将接收到的Sequence number加一赋值给响应报文的Acknowledge number字段(ack = 10001+1 = 10002)
  2. 确认客户端可以接收服务器发送的报文
    将CODE字段中的SYN置为1,并且生成一个随机的Sequence number,假设此时只为20001。(跟步骤A一样的操作)

报头信息: ACK=1 ack=10002 SYN=1 seq=20001

C: 回送确认报文

  1. 当客户端收到来自服务端的ack后,就能够确认A步骤的报文被正确的接收。此时我们还要回应服务端我们是否接收到了他的请求,所以还要在发送一个确认报文,流程跟B步骤中的第一步一致

    报头信息: ACK=1 ack=20002

  2. 带有SYN标志的过程是不可以携带数据的,也就是说三次握手的前两次是不可以携带数据的(逻辑上看,连接还没建立,携带数据好像也有点说不过去),但建立连接的第三次握手允许携带数据。

D: 取得最后确认

若一切都顺利,在服务器端收到带有 ACK=1 且 ack=20002 序号的封包后,就能够建立起这次的联机了。

总结

三次握手的对话比喻:

  1. 小明:小红你现在忙不
  2. 小红:我不忙,那小明你忙不
  3. 小明:我也不忙
  4. 此时两个人就可以愉快的对话了
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值