http连接
在开发中我们进行网络请求,我们大部分情况都是使用的是http连接,但http是怎样建立起连接的呢,通过下图我们看下连接的过程!
- 1.客户端向服务器发送一个通信的请求 发出一个seq:j
- 2.服务器接受这个请求,向服务器发送 ack = j + 1,并同时 服务器向客户端发送一个新的seq:k
- 3.客户端将服务器发送过来的seq +1 即 k+1 发送到服务器。
这样就完成了http连接的3次握手操作。
我们可以通过wireShark抓包工具来获取http三次握手的整个过程
WireShark抓包验证
首先打开WireShark,选择 Loopback 过滤条件

然后分别打开2个终端来,分别输入
nc -l 6060

nc 127.0.0.1 6060

这样我们就建立了一个http连接,通过WireShark抓包我们可以看到

- A -> B [SYN] Seq = 87759268
-
2 B->A [SYN,ACK] ACK = 87759269,Seq = 1242099438
-
3, A->B [ACK] ACK = 1242099439
这样即完成连接时的3次握手
http断开
我们看下http断开时的四次挥手的整个过程

我们关闭其中一个终端即可断开http连接,利用WireShark来抓取整个过程

从抓包数据我们可知
- 1.客户端向服务器发送 [FIN,ACK] Seq = 1242099446,ACK = 87759269
- 2.服务端将 客户端发送的 Seq + 1 作为ACK 即 ACK =Seq + 1,同时将ACK作为Seq发送到客户端即 [ ACK] Seq = 87759269,ACK = 1242099447发送到客户端
- 3.服务器接着向客户端发送消息[FIN,ACK] Seq = 87759269,ACK = 1242099447,此次报文内容和第二次的FIN和ACK值相同。
- 客户端将服务器端 发来的Seq + 1 作为ACK值,发送给服务器:[ACK] ACK = 87759270
这样就完成了http连接的断开
- 客户端将服务器端 发来的Seq + 1 作为ACK值,发送给服务器:[ACK] ACK = 87759270
为什么要进行3次握手和4次挥手
个人理解,在进行http连接时,客户端首先向服务器端发送连接的通信,然后服务器立即同意了对方通信的要求,因为此时还没有连接,服务器端没有未处理完的事务,可以即刻向对方发出通信的请求,最后等待客户端的同意。在http断开时,客户端向服务器端发出close请求,然后,服务器端同意客户端发出的close请求,因为服务器端可能还没处理完 移动端上次请求的事务,不能立即发出close请求,需要等到处理完成后再向客户端发出close请求。再服务器器处理完之后,向移动端发出close请求,最后移动端同意服务器端发出的close请求。
网友评论