详细版
- 1)首先是:DNS查询
- 有DNS的地方就有缓存,所以浏览器会会先检查一些浏览器有没有本地缓存,(如果有直接返回ip地址,结束DNS查询,后面的同理),然后是检查系统host文件里面有没有缓存,然后是路由器有没有缓存,如果前面的都没有,那么就向本地DNS服务器发起递归查询,本地DNS服务器向根DNS服务器,顶级域DNS服务器,权威DNS服务器发起迭代查询,具体是先向根服务器查询顶级域(.com,.net,.edu等这些),拿到顶级域服务器IP之后向其发起查询,其返回权威服务器的IP,又向这个新的IP发起查询,这个权威服务器再放回所访问域名的IP地址,本地DNS服务器拿到这个真正的IP地址后向客户端浏览器返回,客户端浏览器才开始向这个IP地址发起TCP连接
- 2)然后是:建立TCP连接
- SYN置1 ,随机初始序号,发送SYN后进入SYN_SENT状态
- serviceSYN cookie防御系统
- 没有部署
- 为该连接分配 TCP缓存和相关变量(半开连接) ,随机初始序号,SYN置1,ACK(SYNACK报文段)
- 有部署
- 不生成半开连接 ,而是把初始序号设为hash(源IP,源port,目的IP,目的port),之后就还没有部署一样
- 再搜到客户的ACK后判断ACK的确认序号-1是否等于hash(源IP,源port,目的IP,目的port),是的话才分配 TCP缓存和相关变量,此时TCP连接才正式建立双向连接
- 客户收SYNACK后分配 TCP缓存和相关变量,进入ESABLISHED状态,SYN置0,ACK,可开始携带数据(HTTP请求)
- 3)服务端对请求进行相应,客户拿到相应数据后开始解析HTML文档,解析完成后渲染显示在屏幕上
- 4)在服务端发送完响应后,如果HTTP请求的首部行Connection
- 为close
- 服务器断开TCP连接
- 服务器FIN置1,发送后进入FIN_WAIT_1状态
- 客户发送ACK,服务器接到ACK后进入FIN_WAIT_2状态。
- 等客户确认数据发送完成后,FIN置1,发送给服务器
- 服务器收到FIN后发送ACK并进入TIME_WAIT状态,经过某个等待时间后连接正式关闭,释放资源,客户端收到这个ACK后也响应的关闭连接,释放资源
- 为 keep-alive
简记版
在浏览器输入地址回车到页面显示流程
- DNS查询
- 浏览器缓存,host,路由器缓存,本地DNS,根,顶级域,权威
- 建立TCP连接
- SYN置1 ,随机初始序号,发送SYN后进入SYN_SENT状态
- serviceSYN cookie防御系统
- 没有部署
- 为该连接分配 TCP缓存和相关变量(半开连接) ,随机初始序号,SYN置1,ACK(SYNACK报文段)
- 有部署
- 不生成半开连接 ,而是把初始序号设为hash(源IP,源port,目的IP,目的port),之后就还没有部署一样
- 再搜到客户的ACK后判断ACK的确认序号-1是否等于hash(源IP,源port,目的IP,目的port),是的话才分配 TCP缓存和相关变量,此时TCP连接才正式建立双向连接
- 客户收SYNACK后分配 TCP缓存和相关变量,进入ESABLISHED状态,SYN置0,ACK,可开始携带数据(HTTP请求)
- 服务端对请求进行相应,客户拿到相应数据后开始解析HTML文档,解析完成后渲染显示在屏幕上
- 在服务端发送完响应后,如果HTTP请求的首部行Connection
- 为close
- 服务器断开TCP连接
- 服务器FIN置1,发送后进入FIN_WAIT_!状态
- 客户发送ACK,服务器接到ACK后进入FIN_WAIT_2状态。
- 等客户确认数据发送完成后,FIN置1,发送给服务器
- 服务器收到FIN后发送ACK并进入TIME_WAIT状态,经过某个等待时间后连接正式关闭,释放资源,客户端收到这个ACK后也响应的关闭连接,释放资源
- 为 keep-alive
|