概述
最近复习(预习)了一下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指定。
三次握手协议的过程:
- 客户端(通过执行connect函数)向服务器端发送一个SYN包,请求一个主动打开。该包携带客户端为这个连接请求而设定的随机数A作为消息序列号。
- 服务器端收到一个合法的SYN包后,把该包放入SYN队列中;回送一个SYN/ACK。ACK的确认码应为A+1,SYN/ACK包本身携带一个随机产生的序号B。
- 客户端收到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,“三次握手”的目的是在不可靠的信道上创建可信通信连接,需要双方通知对方自己的分组的序列号的开始数值。
最后
以上就是唠叨嚓茶为你收集整理的HTTP的三次握手的全部内容,希望文章能够帮你解决HTTP的三次握手所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复