HTTP请求详解
首先http请求如下
域名解析—-发起TCP的三次请求—建立TCP连接后发起http请求—服务器响应http请求,浏览器得到html代码—浏览器解析html代码,并请求代码中的资源(js css 图片)—浏览器渲染页面
以chrome为例
1.域名解析(DNS)
DNS(Domain Name System,域名系统),万维网上作为域名和IP地址相互映射的一个分布式数据库
浏览器会解析你输入域名所对应的IP地址
localhost--->127.138.1.1
2.发起TCP的三次握手
①有客户端发出SYN消息
②服务器端使用SYN+ACK表示接收到这个消息
③客户端以ACK消息响应
以上三步在服务器端和客户端建立连接,才能进行数据通信
下面一段内容引自https://www.cnblogs.com/engeng/articles/5959335.html
拿到域名对应的IP地址之后,User-Agent(一般是指浏览器)会以一个随机端口(1024 < 端口 < 65535)向服务器的WEB程序(常用的有httpd,nginx等)80端口发起TCP的连接请求。这个连接请求(原始的http请求经过TCP/IP4层模型的层层封包)到达服务器端后(这中间通过各种路由设备,局域网内除外),进入到网卡,然后是进入到内核的TCP/IP协议栈(用于识别该连接请求,解封包,一层一层的剥开),还有可能要经过Netfilter防火墙(属于内核的模块)的过滤,最终到达WEB程序(本文就以Nginx为例),最终建立了TCP/IP的连接。
3.发起HTTP请求
指由客户端像服务器端发送的信息,这个信息有如下三部分
①请求行
请求行的写法是固定的,有三部分构成
第一部分是请求方法,有我们常见的GET和POST方法
第二部分是请求的网址
第三部分是http版本
例 GET www.baidu.com http/1.1
②HTTP请求头
HTTP头在HTTP请求可以是三种头
请求头(header header)
普通头(general header)
实体头(entity header)
GET没有实体头
③内容
在POST请求中才有
4.服务器端HTTP响应请求
当服务器收到HTTP请求,会根据信息做某些处理(比如当页面中含有php代码,会 交给apche中的php模块去解析后返回),相应的返回一个HTTP响应。
响应体的结构类似于请求头
1.状态行
第一部分是http的版本号
第二部分是响应的状态码
第三部分是对状态码的描述
+ 信息类 100-199
+ 响应成功 200-299
+ 重定向 300-399
+ 客户端信息错误 400-499
+ 服务器端错误类 500-599
2.http头
HTTP响应体包括
响应头
普通头
实体头
3.返回内容
HTTP的相应内容可以是一个html页面,也可以是一个图片
相应数据的格式通过content-Type字段获得
5.浏览器解析代码,并请求代码中的资源
有时候获取到一个HTML页面,在浏览器解析过程中发现还有url,就会再次发起http请求,
许多的HTTP请求只依靠一个TCP连接,这就是所谓的持久连接。HTTP/1.1和之前版本的显著区别是HTTP/1.1默认使用持久连接。即,除非服务端在应答中明确指出(请求中Connection域的值是”close”),客户端应当假定服务端会维持一个持久连接,即使从服务端收到的应答是报告错误。
6.浏览器渲染页面
HTTP长连接 短连接 持久连接
HTTP长连接
客户端与服务器端建立连接,建立连接之后不断开,在进行报文的发送和接收
步骤如下:建立连接—-数据传输(保持连接)数据传输—关闭连接
使用场景
监控系统:后台硬件的热插拔,LED,温度,电压变化
即时通讯系统:其他用户登录,发送信息
橡这些链接,如果每次都建立连接在关闭的话处理速度会变低。所以连接上以后,不用在建立TCP链接,直接发送数据
短连接
客户端与服务器端没进行一次报文交易才进行通讯连接,完毕之后立即断开,
短连接操作步骤 :
建立连接——数据传输——关闭连接…建立连接——数据传输——关闭连接
使用场景:
PC端和移动端的web网站,这种操作频繁,点对点通讯,每次TCP链接都需要三次握手四次挥手,
持久连接
现有的持久连接类型有两种:HTTP/1.0+的keep-alive和HTTP/1.1的persistent.