第十天:TCP序号_确认号 建立连接

第十天:TCP序号_确认号 建立连接

在建立HTTP请求之前需要经历三次连接

image-20211011195754800

​ 这就是三次握手,我主动发送数据包给你,我想和你建立连接,然后服务器也给我一个回复,ACK就是回应,然后我再向你发送一次建立请求,通过后就开始传送数据。

image-20211011200140333

就像上图一样,值得注意的是,SYN(同步)只有前两次都是1,其余都是0

执行完三次握手后,就会发送HTTP请求

image-20211011200632093

当所有数据完成后,就会发送200,表明服务器发送完成

序号

image-20211011200945351

知道你的序号和长度,那么我返回的长度就是ACK:序号+数据长度

假设每发一个包,服务器就会给一个响应。序号和确认号是相对值。

image-20211011201651519

我们看到的是1,实际上他是把一个真实的大数字放在序号号确认号

我们现在看看原生的值,一开始我们再建立连接的时候就要确定,那是怎么确认的?

image-20211011202641146

在建立连接时,除了会发送SYN,还会发送一个序号初始值,从第一次握手就会发送一个序号初始值,而这个序号是随机生成的。当第二次握手时,服务器也会向客户端发送一个序号初始值,也是随机生成。

所以实际我们的序号都是相对值,通过这样的方式可以保护网络安全。

image-20211011203050659

服务器和客户端都有自己的序号初始值,由于都是随机生成,一般着两个序号是不一样的

image-20211011203237933

接下来,我们具体来分析一下这9步

image-20211011203502871

第1步

image-20211011203556577

建立连接的时候,SYN为0,只有TCP的头部,发送的第一部分只有头部。

当ACK为0时,ack的数据数据都没有意义。

第2步

image-20211011204254705

为什么这里的ACK为1?

实际上ACK是收到数据后的回应,因为我之前收到的数据是0,所以我这里收到的ACK就是1

第3步

image-20211011205443320

此时此刻的SYN为0,这里的ack为1是为了响应上一次的ACK

第四步image-20211011205915640

为什么这里ACK为什么还是1?,因为第三次和第四次都是客服端给服务端发数据,因为上次一次服务器发送给我的数据是0,所以ACK是1

建立连接之后,发送HTTP请求,前三次的数据部分都是0,但是从第四次开始,就有数据了,这里的数据实际上就是HTTP数据部分

image-20211011205904339

第五步

image-20211011210312531

首先看ACK,我们先看第四次,我们发现客服端给我们的数据是K个字节,说明我们收到了K个字节,所以这里的字节就是k+1个字节,希望对方从k+1开始发送

然后我们来看看seq,因为之前没有数据,肯定就是从1开始

第六步

image-20211011210545099

为什么这里的ack还是k+1,因为ACK是对上一次发送的数据的回应,很明显,这里还是K+1,

seq为什么变成了b1+1了呢

这里是第二个包的序号绝对是前面发送数据包的长度+1。

第七步

image-20211011210700721

第8步

image-20211011210713628

这几步与第六包差不多。

第九步

image-20211011211901950

当数据发送完成后,客服端回应服务端,ACK:b1+b2+b3+b4+1,表示收到了这么多字节,并且希望从这数据发送

SYN表示同步请求,表示服务器第一次发送东西给我;我第一次发送东西给服务器,SYN都为1,也是在这个时候才会给出原生的初始值

现在我们带上真实初始序号来看看过程

image-20211012074231585

在这里值得注意的是,客服端发出的序号s1和等会服务器返回给客户端的序号也是s1,同理服务器发出的序号S2,等会客服端返回的序号也是S2,这两者是各干各的

初始值=原生值-相对值

我们再来来回顾一下,来看看这个图

image-20211012075704708

这个就是这个过程

建立连接—三次握手

image-20211012080138780

状态解读

CLOSED:client处于关闭状态

LISTEN:server处于监听状态,等待client连接

SYN-RCVD:表示server接收到了SYN报文

SYN-SENT:表示client已发送SYN报文,等待server的第2次握手

ESTABLISHED:表示连接已经建立

前两次握手的特点
  • SYN都设置为1

  • 数据长度都为0

  • TCP头部长度一般都为32字节

    固定头部:20字节

    选项部分:12字节

  • 双方会交换确认一些信息

    比如MSS、是否支持SACK(选择性确认)、window scale(窗口缩放系数)

    这些数据都会放在头部的选项部分

为什么一定要三次握手?两次不行吗?

我想和你建立连接,然后你回应了我说,没问题,我也想和你连接,这样的方式从逻辑上也没有问题,那究竟是为什么呢?

主要目的:防止server端一直等待,浪费资源

如果只建立两次握手,可能会出现的情况

  • 假设client发出的第一个连接请求报文段,因为网络延迟,在连接释放以后的某个时间才到达server

  • 本来这是一个早已失效的连接请求,但server收到此失效的请求后,误认为是client再次发出一个新的连接请求

  • 于是server就像client发出报文确认报文段,同意进建立连接

  • 如果不采取三次握手,那只要server发出确认,新的连接就建立了

  • 由于现在client并没有想连接服务器的意愿,因此不会理睬server的确认,也不会向server发送数据

采取三次方式的方法就可以防止上述现象的发生

第三次失败了会怎么处理?

此时server的状态为SYN-RCVD,若等不到client的ACK,server会重新发送SYN+ACK包

如果server多次发送重发SYN+ACK都等不到client的ACK,就会发送RST包,强制关闭

image-20211012192015323

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值