本文已参与「新人创作礼」活动,一起开启掘金创作之路。
# 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
知之者不如好之者,好之者不如乐之者