一、TCP 四次挥手
OSI 虽然很学术,但是 要熟悉,一般工程使用 IEEE 的 TCP/IP 的四层模型。
4G 和 5G 这种事在数据链路层及以下的协议
两端都可能发起分手,分手4个流程如下:
客户端发送 FIN=1,seq = x ,随后进入 FIN_WAIT_1
服务端收到之后进入 CLOSE_WAIT 状态,随后发送确认 ACK = 1,ack = x + 1,客户端收到之后变为 FINE_WAIT_2 状态
接着服务端也发送 FIN = 1, seq = y ,随后进入 CLOSE 状态
客户端收到之后,变为 TIME_WAITING 状态,随后发送确认 ACK = 1,seq = y +1 ,服务端收到之后变为 CLOSED 状态
最后,客户端在 TIME_WAITING 状态持续了 2* MSL 时长之后,才最终变为 CLOSED 状态
MSL 即 最长报文段寿命,即一个报文在网络上能存活的最长时间,协议规定是 2分钟,一般定义成 30s ,所以 是等待 1~4分钟。
面试官:为什么要 4 次?
因为是TCP 是全双工的,必须要确认双方都没有数据要发送了,才能结束。假如,客户端发送了 FIN 的时候,服务端没有数据了,可以将 ACK 和 FIN 同时发送,所以,这就变成了 3 次了。
为什么 TIME_WAITING ?
有可能最后一步客户端发送的 ACK 丢失了,这时候服务端以为客户端没收到,可能会重发 FIN 过来,所以必须要等待
A 应用程序用了 123 端口,它关闭了,之后,B应用用了 123 端口,此时 A 应用的服务端还发送了数据,由于是马上重用了 123 端口,所以这个数据很大可能还没过期,此时 B 应用就没法区分了这个数据了。所以TIME_WAITING 可以让数据在网络上过期,便于区分
二、网络工具
wireshark 目前免费,支持的协议比较多,所以比较推荐使用 wireshark。 wireshark 工具可以查看网络情况,在输入栏里面可以做一些过滤,比如:
!udp //不看udp
ip.addr==101.89.23.12 //只看特定的ip
!udp and ip.addr==101.89.23.12 //不看udp 并且 指定ip
除了 and 还有多种符号,or ,xor(异或) 等等
三、一次完整的 Http 请求的过程
一次完整的http请求过程,比如在浏览器中输入一个网址,最后怎么出来网页展示出来的?总共大概有 7 个步骤:
首先 DNS 解析域名(浏览器缓存、操作系统缓存或者 DNS 服务器)
三次握手建立 TCP 连接
客户端发起 Http 请求
服务端响应 Http 请求
客户端解析 Html 代码,并请求 Html 代码中的资源
客户端渲染展示内容
关闭 TCP 连接
DNS 劫持和 Http劫持:http 劫持是把 html 的内容给替换了,或者http 的请求给你改了,到其他页面了
防止劫持的手段: 用自己的 DNS 不要用点心公司的,使用 https 。