http协议之三次握手、四次挥手解析

2,073 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

# http协议预先准备

两台机器:0.234: 客户端 0.199:服务端

从最应用层开始: 在这里插入图片描述

一个请求从发送到到达的经过:

1.首先应用层客户端应用层通过请求DNS服务器解析域名拿到服务器IP,然后发送HTTP请求,请求体包括:请求头 空行 请求报文,请求体又包括请求的方法,目标url,协议,ug等

2.传输层的TCP提供了可靠的字节流传输,向对应IP所在的服务器发起TCP连接,经过三次握手连接成功后传输报文

3.网络层IP协议查询mac地址,为的是保证确定传到哪一台机器上,也就是物理地址

4.接收端的链路层接收到数据包,再层层向上直到应用层,这个过程包括在运输层通过TCP协议分段的数据包重新组成HTTP请求报文,传送到我们自己写的服务里

5.接下来就是服务器响应了,返回响应报文,包括最重要的信息 -- 状态码

6.请求完毕后断开TCP连接,任意一方都可关闭,关闭TCP连接需要四次挥手

三次握手

  • 这里采用tcp抓包 Wireshark 在这里插入图片描述 1.发送[SYN]包 SYN=1,ACK=0,SEQ=0标志的数据包给服务器

2.服务器收到数据包,允许连接的情况下会回发一个[SYN,ACK]包 SYN=1,ACK=1的数据包给到发送端,让客户端再发送一个确认的数据包

3.客户端收到允许连接的数据包,再次发送[ACK]确认包,SYN=0,ACK=1,SEQ=1给到服务端,TCP建立连接成功

SYN:同步序列编号,是TCP/IP建立连接时使用的握手信号

ACK:确认标识

SEQ:当前发送数据的计数

四次挥手 在这里插入图片描述

这里是服务端发起关闭请求

1.服务端发送[FIN,ACK]数据包,SEQ=X,ACK=Y,发起连接关闭请求

2.客户端收到数据包,再发送一个确认关闭的数据包[ACK],SEQ=Y,ACK=X+1到服务端,告诉服务端可以关闭连接数据包了

3.客户端发送关闭连接数据包[FIN,ACK],SEQ=Y,ACK=X+1到服务端, 这个连接进入TIME_WAIT状态

4.服务端收到确认关闭连接数据包后,再发送一个确认收到的数据包[ACK],SEQ=X,ACK=Y+1

服务连接就此关闭

TIME_WAIT状态?

熟称2MSL(报文最大存在时间),在此期间该连接将不能再被使用。事实上,对于我们比较有现实意义的是,这个端口将不能再被使用

为什么会有TIME_WAIT这个状态?

网络不可靠可能会导致最后ack报文丢失

避免下次重复的ip加端口来建立等待的连接

为什么握手是四次?

主动方在发起关闭连接的时候,可能被动方还有数据未传输完毕,此时不能马上关闭socket,所以需要再发送报文给你表示同意了才能关闭

tcp和udp传输协议的区别?

TCP协议是通过三次握手才能连接上发送数据的,udp是无连接的,直接发送的

TCP协议保证数据按序发送,按序到达,有超时重传保证可靠性,udp不保证按序,也不保证到达,只管发送不管是否接收

TCP是面向字节流的服务,UDP是面向报文的服务

下一篇:docker上 nginx + ssl + http2

知之者不如好之者,好之者不如乐之者