博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
测试开发面试准备之HTTP协议-三次握手
阅读量:7078 次
发布时间:2019-06-28

本文共 1644 字,大约阅读时间需要 5 分钟。

发起TCP的3次握手

 

拿到域名对应的IP地址之后,User-Agent(一般是指浏览器)会以一个随机端口(1024 < 端口 < 65535)向服务器的WEB程序(常用的有httpd,nginx等)80端口发起TCP的连接请求。这个连接请求(原始的http请求经过TCP/IP4层模型的层层封包)到达服务器端后(这中间通过各种路由设备,局域网内除外),进入到网卡,然后是进入到内核的TCP/IP协议栈(用于识别该连接请求,解封包,一层一层的剥开),还有可能要经过Netfilter防火墙(属于内核的模块)的过滤,最终到达WEB程序(本文就以Nginx为例),最终建立了TCP/IP的连接。

如下图:

1) Client首先发送一个连接试探,ACK=0 表示确认号无效,SYN = 1 表示这是一个连接请求或连接接受报文,同时表示这个数据报不能携带数据,seq = x 表示Client自己的初始序号(seq = 0 就代表这是第0号包),这时候Client进入syn_sent状态,表示客户端等待服务器的回复

2) Server监听到连接请求报文后,如同意建立连接,则向Client发送确认。TCP报文首部中的SYN 和 ACK都置1 ,ack = x + 1表示期望收到对方下一个报文段的第一个数据字节序号是x+1,同时表明x为止的所有数据都已正确收到(ack=1其实是ack=0+1,也就是期望客户端的第1个包),seq = y 表示Server 自己的初始序号(seq=0就代表这是服务器这边发出的第0号包)。这时服务器进入syn_rcvd,表示服务器已经收到Client的连接请求,等待client的确认。

3) Client收到确认后还需再次发送确认,同时携带要发送给Server的数据。ACK 置1 表示确认号ack= y + 1 有效(代表期望收到服务器的第1个包),Client自己的序号seq= x + 1(表示这就是我的第1个包,相对于第0个包来说的),一旦收到Client的确认之后,这个TCP连接就进入Established状态,就可以发起http请求了。

看抓包截图:

 

⑨ 号包 这个就是对应上面的步骤 1)

⑩ 号包 这个对应的上面的步骤 2)

号包 这个对应的上面的步骤 3)

 

作者:大闲人柴毛毛
链接:https://www.zhihu.com/question/24853633/answer/254224088
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

为什么连接建立需要三次握手,而不是两次握手?

防止失效的连接请求报文段被服务端接收,从而产生错误。

PS:失效的连接请求:若客户端向服务端发送的连接请求丢失,客户端等待应答超时后就会再次发送连接请求,此时,上一个连接请求就是『失效的』。

若建立连接只需两次握手,客户端并没有太大的变化,仍然需要获得服务端的应答后才进入ESTABLISHED状态,而服务端在收到连接请求后就进入ESTABLISHED状态。此时如果网络拥塞,客户端发送的连接请求迟迟到不了服务端,客户端便超时重发请求,如果服务端正确接收并确认应答,双方便开始通信,通信结束后释放连接。此时,如果那个失效的连接请求抵达了服务端,由于只有两次握手,服务端收到请求就会进入ESTABLISHED状态,等待发送数据或主动发送数据。但此时的客户端早已进入CLOSED状态,服务端将会一直等待下去,这样浪费服务端连接资源。

TCP四次挥手

 

v2-c8b61ed2a249700583b11bc5d16c5711_hd.jpg

TCP连接的释放一共需要四步,因此称为『四次挥手』。

我们知道,TCP连接是双向的,因此在四次挥手中,前两次挥手用于断开一个方向的连接,后两次挥手用于断开另一方向的连接。

转:https://blog.51cto.com/linux5588/1351007

转载于:https://www.cnblogs.com/william126/p/10886215.html

你可能感兴趣的文章
用vue开发单页应用的一些心得
查看>>
步步为营:SQLServer查询随机不相同的记录插入临时表
查看>>
About SOuP
查看>>
【12c OCP】CUUG OCP认证071考试原题解析(36)
查看>>
join
查看>>
今天linux遇到的问题
查看>>
LeetCode:Balanced Binary Tree
查看>>
4.时间复杂度和空间复杂度-2
查看>>
华为架构师8年经验谈:从单体架构到微服务的服务化演进之路
查看>>
[cogs2652]秘术「天文密葬法」
查看>>
前端之移动页面布局
查看>>
Computer Vision Algorithm Implementations
查看>>
hdu 4409 Family Name List
查看>>
hdu4407 n(n<=400000)个数,a[i]=i,m个询问及更改(m<=1000),更改某个位置的数,询问区间与这个数互质数的和:容斥/离线...
查看>>
04 memory structure
查看>>
NSFileHandle
查看>>
Android IDE 环境搭建
查看>>
Jffs2根文件系统制作[转]
查看>>
善于记录,善于总结——《走出软件作坊》读后感
查看>>
Navicat for SQL Server 安装的步骤是这样的
查看>>