HTTP的三次握手

最近复习(预习)了一下http协议相关的知识,做个总结供以后复习(预习):

特点:面向连接,点到点的安全(相对于UDP)传输协议

这里着重讲下自己对http的三次握手的理解,有错误的地方希望大家可以指出:

SYN:synchronous建立联机

ACK:acknowledgement 确认

三次握手的目的:1、一定程度上保证信息传输的安全性 2、确认自己发送和接收消息的能力

第一次握手:SYN包(x)

客户端向服务端发送一个SYN包,包中包含一个随机数x。

第二次握手:ASK包(x+1)、SYN包(y)

服务端收到客户端发送的SYN包后:

1、要告诉客户端自己收到了消息:把客户端发送的SYN包中的随机数返回给客户端(生成一个ASK包,包中包含客户端发送的随机数+1:x+1)

2、要确认自己发消息的能力:生成一个SYN包,包中包含一个随机数y

综上:第二次握手,服务端向客户端发送一个SYN包和一个ASK包。

第三次握手:ASK包(y+1)

1、客户端收到服务端发送的ASK包:校验ASK包中的数字为x+1表示自己有收发信息的能力,并且确定这个是自己最初要访问的服务端。

2、客户端收到服务端发送的SYN包:把SYN包中的随机数y取出,放入到新生成的ASK包,发送给服务端,服务端收到ASK后表示自己具有收发消息的能力。

以下内容摘自维基百科

TCP用三次握手(或称三路握手,three-way handshake)过程创建一个连接。在连接创建过程中,很多参数要被初始化,例如序号被初始化以保证按序传输和连接的强壮性。

TCP连接的正常创建

一对终端同时初始化一个它们之间的连接是可能的。但通常是由一端(服务器端)打开一个套接字socket)然后监听来自另一方(客户端)的连接,这就是通常所指的被动打开(passive open)。服务器端被被动打开以后,客户端就能开始创建主动打开(active open)。

服务器端执行了listen函数后,就在服务器上创建起两个队列:

  • SYN队列:存放完成了二次握手的结果。 队列长度由listen函数的参数backlog指定。
  • ACCEPT队列:存放完成了三次握手的结果。队列长度由listen函数的参数backlog指定。

三次握手协议的过程:

  1. 客户端(通过执行connect函数)向服务器端发送一个SYN包,请求一个主动打开。该包携带客户端为这个连接请求而设定的随机数A作为消息序列号。
  2. 服务器端收到一个合法的SYN包后,把该包放入SYN队列中;回送一个SYN/ACK。ACK的确认码应为A+1,SYN/ACK包本身携带一个随机产生的序号B
  3. 客户端收到SYN/ACK包后,发送一个ACK包,该包的序号被设定为A+1,而ACK的确认码则为B+1。然后客户端的connect函数成功返回。当服务器端收到这个ACK包的时候,把请求帧从SYN队列中移出,放至ACCEPT队列中;这时accept函数如果处于阻塞状态,可以被唤醒,从ACCEPT队列中取出ACK包,重新创建一个新的用于双向通信的sockfd,并返回。

如果服务器端接到了客户端发的SYN后回了SYN-ACK后客户端掉线了,服务器端没有收到客户端回来的ACK,那么,这个连接处于一个中间状态,既没成功,也没失败。于是,服务器端如果在一定时间内没有收到的TCP会重发SYN-ACK。在Linux下,默认重试次数为5次,重试的间隔时间从1s开始每次都翻倍,5次的重试时间间隔为1s, 2s, 4s, 8s, 16s,总共31s,第5次发出后还要等32s才知道第5次也超时了,所以,总共需要 1s + 2s + 4s+ 8s+ 16s + 32s = 63s,TCP才会断开这个连接。使用三个TCP参数来调整行为:tcp_synack_retries 减少重试次数;tcp_max_syn_backlog,增大SYN连接数;tcp_abort_on_overflow决定超出能力时的行为。

根据 RFC 793,“三次握手”的目的是在不可靠的信道上创建可信通信连接,需要双方通知对方自己的分组的序列号的开始数值。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值