这是我参与8月更文挑战的第22天,活动详情查看: 8月更文挑战
当我们在浏览器输入百度时候,这个时候就打开了百度的搜索页面,当网页加载完毕后,就完成了一次http的请求,在这请求过程中,都发生了怎样的操作呢?浏览器访问服务器采用的是HTTP协议,http(Hyper Text Transfer Protocol)叫做超文本传输协议,是运行在TCP之上,将两端的TCP通信按照HTTP协议进行数据的封装。
DNS解析域名
我们在浏览器中大多数都输入的域名,域名需要DNS解析之后获取到具体的IP地址,这个时候才会在网络中进行传输。DNS(Domain Name System),它和 HTTP 协议一样是位于应用层的协议,主要提供域名到IP 的解析服务。我们在浏览器中直接输入IP也可以访问到具体的网站,使用域名的话是 方便用户记住,也方便切换域名到其他IP,例如下面直接在浏览器中直接输入百度的IP也同样可以打开。
- 通过ping获取域名IP:39.156.66.14
-
浏览器中输入百度IP:39.156.66.14 一样可以打开百度的网页地址
-
域名的解析过程
通过DNS服务获取到具体的IP地址,然后通过IP地址找到具体的服务器,其中DNS查找到时候会先找本地的hosts,如果本地hosts配置了域名解析,就会返回本地的IP地址,本地hosts没有的话,就会走局域网DNS解析,这种在软件部署的时候比较多,不同服务之间的访问通过域名来访问,如果局域网DNS解析不存在,就走公网的DNS解析。
TCP之间建立连接
HTTP只是一种连接,底层传输采用的就是TCP,TCP建立连接需要3次握手
- 第一次握手
(SYN=1, seq=x)客户端发送一个TCP的SYN 标志位置1的包,指明客户端打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字里。发送完毕后,客户端进入SYN_SEND 状态。
- 第二次握手
(SYN=1, ACK=1, seq=y, ACKnum=x+1):服务器发回确认包(ACK) 应 答 。 即SYN 标志位和ACK 标 志 位 均 为1。服务器端选择自己 ISN 序列号,放到 Seq 域里,同时将 确 认 序 号(Acknowledgement Number)设置为客户的 ISN 加 1, 即 X+1。发送完毕后,服务器 端 进 入SYN_RCVD 状态。
- 第 三 次 握 手
(ACK=1 ,ACKnum=y+1)客户端再次发送确认包(ACK),SYN 标志位为 0,ACK 标志位为 1,并且把服务器发来 ACK 的序号字段+1,放在确定字段中发送给对方,并且在数据段放写 ISN 发完毕后 , 客 户 端 进 入ESTABLISHED 状态,当服务器端接收到这个包时,也进 入ESTABLISHED 状态,TCP 握手结束,建立连接发生数据。
浏览器与服务器HTTP请求
通过浏览器F12可以查看请求的网络信息
Http请求报文是由请求行,请求头,空行,和请求数据4个部分组成。
- 请求方法
http协议中定义不同的请求方法,GET(完整请求一个资源)、POST(提交表单)、PUT(上传文件)、DELETE(删除)、PATCH、HEAD(仅请求响应首部)、OPTIONS(返回请求的资源所支持的方法)、TRACE(追求一个资源请求中间所经过的代理)。比较常用的是GET和POST。
- URL
url是指我们在浏览器中输入的路径,也称为统一资源定位符,可以找到唯一的识别方法。就比如:www.baidu.com/s?ie=UTF-8&… 这个地址又分为了几部分,https代表协议的协议版本,www.baidu.com 代表请求的域名,在后面还有一个端口,由于是80端口,所以后面就可以不用写,问号后面代表请求的参数。协议: //域名:端口/请求参数 按照这样的进行封装。
- 协议版本
Http的协议现在用的是HTTP/1.1
- 请求头部
这图上比较多,请求头是为请求的数据添加一些附加信息,键值对组成,我们在后端通过key值可以获取到具体的数据。
| 请求头 | 描述 |
|---|---|
| Host | 请求的服务器地址,可以域名也可以是IP地址 |
| User-Agent | 客户端的信息 |
| Connection | 连接相关信息 |
| Accept-Encoding | 通知服务器端客户端发送的编码格式 |
| Accept-Language | 通知服务器端客户端发送的语言 |
| Cookie | 客户端携带的信息 |
- 请求数据
客户端发给服务端的数据,GET请求的话在URL中体现。
当服务器端收到数据后,处理完数据将数据响应给客户端,客户端根据服务端返回的数据渲染到浏览器中这个后就完成了一次http请求。