聊聊 web 中的网络请求

  • 现在大多数情况都需要使用计算机,而大部分计算机都会联网。那么在联网的过程中计算机和其他网络设备需要做哪些操作才开确保网络请求成功并返回需要的数据呢? 本文着重阐述 http请求过程中,即从浏览器请求开始到成功显示返回数据的过程, 会有哪些操作呢?

    完整的http 请求过程概括为

0、浏览器本地缓存匹配;

1、本地hosts映射对比;

2、本地dns缓存解析;

3、远程(运营商)dns解析获得服务器ip地址;

4、浏览器发送tcp连接请求包(syn);

5、TCP/IP连接建立起来后,浏览器就可以向服务器发送HTTP请求了;

6、服务器端接收到请求,根据路径参数,经过处理(包括数据库操作, 计算操作等等),把处理后的一个结果的数据返回给浏览器;

7、浏览器收到结果后, 进行 html 解析, 渲染页面, 把页面呈现给用户;

关键概念

HTTP连接

HTTP协议即超文本传送协议(Hypertext Transfer Protocol),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。
1)在HTTP 1.0中,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。

2)在HTTP 1.1中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。

由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。通常 的做法是即时不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道 客户端“在线”。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。

三次握手

简单解释

ACK : TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1

SYN(SYNchronization) : 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此, SYN置1就表示这是一个连接请求或连接接受报文。

1、第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;
2、第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;
3、第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。
完成了三次握手,客户端和服务器端就可以开始传送数据。以上就是TCP三次握手的总体介绍。

当然图片不是我画的, 知识用来引导解释。而且图中还有四次挥手的过程, 这个就不阐述了, 是指数据传输后断开 TCP连接的过程。

为什么要三次握手

对于初学者可能不理解为何要三次握手, 那如果只有两次握手会是什么样子的呢? 举个两次握手的反面例子, 两个人面对面站着, 其中一人 A想给对方 B 传送口信,A 问对方 B 我要开始传送了, B听到后说可以, 传过来吧?B 说完这句话后被其他事情打扰了, 若此时 A把口信传给 B,那 B 肯定听不到了。就造成传信失败了。但三次握手的存在是为了保证传输能成功进行,并且在可控的范围内完成传输。

扩展阅读

本人也只是半桶水, 只根据自己的理解写了本文。 若想了解更多, 推荐一些文章,加深理解。

TCP三次握手详解及释放连接过程
首先简单介绍一下TCP三次握手
TCP 为什么是三次握手,为什么不是两次或四次?
面试时,你被问到过 TCP/IP 协议吗?
HTTP 权威指南