http请求,三次握手四次挥手

https://app.yinxiang.com/fx/9e9aa1e3-0159-4b5a-9b8c-bd4402cda7e2

  • 网络理解

        

        1,超文本传输协议:http协议

        2,超文本标记语言:HTML

        3,web浏览器:服务端角色

        4,web服务器:服务器角色

        5,url:统一资源定位器,俗称网站地址系统(根据url地址进行域名地址等解析)


  • 网络请求

        1,什么是HTTP协议?

HTTP协议是一种网络传输协议,要实现信息传递,信息发收双方需要遵循某种一致的标准和规范,HTTP协议就是这样一种协议规范。HTTP是基于tcp/ip协议簇来传递数据的。

 

uploading.4e448015.gif转存失败重新上传取消

 

可以看到,http协议是基于传输层的tcp协议和网络层的ip协议的应用层协议。


 

        2,http协议用来做什么?

数据传递。例如发送一个http请求。

在发送请求之前,需要先在客户端和服务端建立起tcp连接。

建立tcp连接前先了解他的工作原理:连接的一端封装数据,另一端拆封数据。

uploading.4e448015.gif转存失败重新上传取消

我们可以看到在数据发送端是一层一层封装数据,数据接收端一层一层拆封,最后应用层获得数据。

 

1,tcp包头信息

uploading.4e448015.gif转存失败重新上传取消

需要注意的是tcp包头信息中的控制位标记,下面建立链接过程用到。

 

tcp报文包=tcp头信息+tcp数据体。头信息中包含的6种控制位代表着tcp的连接状态:

  • URG:紧急数据(urgent data)

  • ACK:确认收到信息

  • SYN: 表示请求建立一个连接

  • RST: 表示要求对方重新建立连接

  • PSH: 提示接收端应用程序应该立即从tcp接受缓冲区中读走数据

  • FIN:表示通知对方本端要关闭连接

建立连接过程(三次握手)

uploading.4e448015.gif转存失败重新上传取消

  1. 第一次握手:客户端向服务端发起建立连接的请求。

  2. 第二次握手:服务器端接受到客户端的连接请求,向客户端发送确认收到,并且向客户端发送建立连接请求。

  3. 第三次握手:客户端收到服务器端的确认信息和连接请求,向服务器端发送确认收到,此时连接建立。

  4. uploading.4e448015.gif正在上传…重新上传取消

 

三次握手讲解:

  • 客户端发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,服务器由SYN=1知道客户端要求建立联机(客户端:我要连接你)

  • 服务器收到请求后要确认联机信息,向A发送ack number=(客户端的seq+1),syn=1,ack=1,随机产生seq=7654321的包(服务器:好的,你来连吧)

  • 客户端收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,客户端会再发送ack number=(服务器的seq+1),ack=1,服务器收到后确认seq值与ack=1则连接建立成功。(客户端:好的,我来了)


建立起连接后,客户端和服务器端就可以互相收发信息了。

由客户端发起http请求,服务器返回请求响应。

响应状态码

uploading.4e448015.gif正在上传…重新上传取消

响应完成后关闭连接,完成数据传递。

四次挥手

uploading.4e448015.gif转存失败重新上传取消

为什么关闭连接是4次挥手而不是像握手一样3次呢?

第一次挥手:客户端向服务器端发起关闭连接请求。

第二次挥手:服务器端接收到关闭连接请求,向客户端发送确认收到,但此时服务器不能像接收到连接请求后同时向客户端发送确认收到和连接请求一样同时向客户端发送确认接收和关闭请求,因为此时服务器端有可能还有数据未响应完成,不能即刻与客户端断开连接,需要一个等待时间处理,,所以此时客户端处于FIN_WA_2状态。

第三次挥手:  服务器端处理完数据可以断开连接了,向客户端发送断开连接请求。

第四次挥手:客户端接收到服务器端的断开连接请求,向服务器端发送确认收到,服务器端断开连接,客户端断开与服务器端的连接。

为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

 

答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

 

参考链接:https://blog.csdn.net/qq_38950316/java/article/details/81087809

                 https://mp.weixin.qq.com/s/Skyh7KRbbu6jrdO4pUCJDQ

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值