HTTP协议

1. 什么是HTTP协议?

  • HTTP协议全称叫做超文本传输协议(HyperText Transfer Protocol),简单来说,就是使得客户端和服务器能否正常沟通的一种内容格式,只有遵守标准的内容格式,两者才能相互发送消息,传输数据;

  • 当我们在浏览器中点击一个链接时,浏览器(代表客户端),会向服务器(代表服务端)发送一段文本,告诉服务器请求的是哪一个链接,服务器收到请求后返回一段文本给浏览器,浏览器会将该文本解析并显示出来。

  • 在上面这段过程中,包括客户端向服务端请求的过程以及服务端向客户端的响应过程,所以HTTP协议分为两个部分:

     1. 客户端向服务端发送的内容格式,叫做"HTTP请求协议";
     2. 服务端向客户端发送的内容格式,叫做“HTTP响应协议”;
    

2. HTTP请求协议

一个标准的HTTP请求协议的内容格式应该包含四个部分,分别是:请求行、请求头、空行、请求数据。

  1. 请求行:请求方法【空格】资源地址(URL)【空格】HTTP协议版本号;

    1. 请求方法:GET POST PUT DELETE HEAD OPTIONS TRACE,其中GET和POST较为常用,GET方法一般用于查询,在URI后附带的查询参数是有限制的,其数据大小通常不能超过1k,POST方法用于提交请求数据,数据大小是无限制的;
    2. 资源地址(URI):域名后的地址,比如:https://csdn.net/md叫做URL,而/md叫做URI;
    3. HTTP协议版本号:HTTP/1.1;
    4. 一个完整的请求行:GET /md HTTP/1.1;
    
  2. 请求头:请求头下面的内容,用来描述浏览器的基本信息;

    1. Accept: application/json, text/javascript;【浏览器可接受的数据类型】
    2. Accept-Charset:UTF-8;【浏览器支持的字符集】
    3. Accept-Encoding:gzip;【浏览器支持的压缩格式】
    4. Accept-Language: zh-CN;【浏览器所处的语言环境】
    5. Connection: keep-alive;【浏览器告诉服务器请求后是断开连接还是保持连接】
    6. Content-Length: 53 ;【浏览器告诉服务器请求的数据长度】
    7. Content-Type: application/json;【浏览器告诉服务器请求数据的类型】
    8. Cookie: 【Cookie内容】
    9. Host: https://csdn.net;【请求资源所在的服务器】
    10. Origin: https://www.cnblogs.com;【浏览器发送请求时所在的服务器】
    11. If-Modified-Since: 【浏览器告诉服务器,缓存数据的时间】
    12. Referer: https://www.cnblogs.com【浏览器告诉服务器,当前请求是从那个页面来的】
    13. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36 Edg/79.0.309.56;【浏览器的内核信息】
    14. Date:【发起请求的时间】
    
  3. 空行:位于请求头后面,必须存在;

  4. 请求数据:一般用于POST请求方法,用于提交的数据;

3. HTTP响应协议

一个标准的HTTP响应协议的内容格式应该包含四个部分,分别是:响应行、响应头、空行、响应数据。

  1. 响应行:HTTP版本号【空格】状态码【空格】状态信息;

     1. HTTP版本号: HTTP/1.1;
     2. 状态码:由三位数字组成;
     		  共分为五种类别如下:
     		  1xx:指示——请求已经被接受,等待处理;
     		  2xx:成功——请求已经被成功接收;
     		  3xx:重定向——要完成请求必须进行下一步操作;
     		  4xx:客户端错误——请求有语法错误;
     		  5xx:服务端错误——服务器未能实现合法的请求;			
     		  常用的类别如下:
     		  200:请求已被成功处理并返回
     		  301:永久重定向
     		  302:临时重定向
     		  400:请求参数不对
     		  405:请求方法不对
     		  401:请求需要权限认证
     		  403:请求的资源禁止被访问
     		  404:资源没找到
     		  500:服务器内部发生错误
     		  503:服务器正忙 
     3. 状态信息:OK(200)、Bad Request(400)、Unauthorized(401)、Forbidden(403)、Not Found(404)、Internal Server Error(500)、Server Unavailable(503)
    
  2. 响应头:描述服务器的基本信息

    1. Access-Control-Allow-Credentials: true
    2. Location:【服务器告诉浏览器需要重定向的URI】
    3. Access-Control-Allow-Origin: https://www.cnblogs.com【只允许cnblogs域名访问】
    4. Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT【服务器告诉浏览器该资源上次更新时间】
    5. Connection: keep-alive【服务器告诉浏览器连接方式】
    6. Content-Length: 613【响应数据的长度】
    7. Content-Type: application/json【响应数据的类型】
    8. Date: 【返回响应数据的时间】
    9. Cache-Control: no-cache 【服务器告诉浏览器不要设置缓存】
    10. Content-Disposition: attachment; filename=【服务器告诉浏览器以下载方式打开数据】
    11. Set-Cookie:SS=Q0=5Lb_nQ; path=/search【服务器告诉浏览器要保存Cookie】
    12. Expires: -1【服务器告诉浏览器不要设置缓存】
    
  3. 空行:必须有;

  4. 响应数据:服务器返回的资源;

4. HTTP1.0协议和HTTP1.1协议的区别

  • HTTP1.0协议中,浏览器与服务器建立连接后,只能获得一个web资源,获取资源后就断开连接,如果还想获取资源需要再次建立连接,叫做短连接;
  • 因为每次获取资源都需要再次建立连接,而建立连接的过程需要消耗一定的时间,所以在HTTP1.1协议中,允许浏览器和服务器建立连接后,在一个连接上可以获取多个资源,保持这个连接,叫做长连接;

5. HTTP协议的特点?

  1. 无连接:无连接是指无长连接,一个请求建一个连接、请求完释放这个连接以释放资源处理其他请求,但是每次请求建一个连接显得很低效,通过添加Keep-Alive功能使当前连接持续有效
  2. 无状态:意味着每次请求都是独立不相关的,即便是长连接也无法使请求之间有联系,如果后续的处理依赖于前面的请求信息,那么它必须重传,导致每次连接传送的数据量增大,增加了大量重复的内容,可以通过Cookie和Session技术保持连接状态。比如:通过在浏览器端用Cookie保存登录信息,用户下一次访问就不用输入账号密码了,在服务器端用Session保存当前状态信息,然后返回给浏览器端一个sessionId,这个sessionId可以用Cookie保存起来,每次访问传送这个sessionId就可以获得之前的状态信息;
  3. 简单、快速、灵活:请求资源时只需要传入请求方法、URL即可,传输的数据类型可以通过Content-Type自定义;

6. HTTP与HTTPS的区别?

HTTP协议是明文传输,是不安全的,为了数据安全性,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并未浏览器和服务器之间的通信加密。简单来说,HTTPS协议就是由HTTP+SSL构建的可进行加密传输、身份认证的网络协议,更加安全。

HTTPS的作用有两点:

  1. 身份认证,确认网站的真实性;
  2. 加密传输,保障数据传输的安全;

使用HTTPS方式发起请求的流程如下:

  1. 浏览器输入URL访问服务器的443端口,建立SSL连接;
  2. 服务器收到请求,将网站的证书传送一份给浏览器,证书中包含公钥
  3. 浏览器建立起会话秘钥,并利用证书中的公钥将会话秘钥加密,之后发送给服务器
  4. 服务器利用自己的私钥解密出会话秘钥并利用会话秘钥加密传输信息
  5. 浏览器利用会话秘钥解密传输信息

HTTP与HTTPS的区别如下:

  1. HTTP用的端口是80,HTTPS的默认端口是443;
  2. HTTP连接是简单无状态的,HTTPS协议是HTTP+SSL协议构建的加密传输、身份认证的协议,更加安全;

HTTP的缺点:

  1. SSL证书需要一定费用;
  2. 连接服务器占用资源过多;
  3. 握手阶段比较费时;

7. 访问一个网站会经历哪些流程?

  1. 域名解析;

      按照域名解析请求顺序依次为:浏览器中DNS缓存—>系统中DNS缓存—>hosts文件定义的映射—>向DNS服务器发起域名解析请求;
    
  2. 建立TCP连接,发起TCP的三次握手;

     1. 第一次握手: 客户端向服务器发送带有SYN=1的数据包,表示请求建立连接,进入SYN-SENT(同步已发送)状态;
     2. 第二次握手:服务器接收后,回传一个带有ACK=1的数据包,表示请求已收到,同时也发送一个SYN=1的数据包,表示服务器请求客户端建立连接,为了简化流程,服务器把ACK包和SYN包合并在一起,即ACK+SYN包,此时服务器进入SYNC-RCVD(同步收到)状态;
     3. 第三次握手:客户端收到服务器的ACK包确认了服务器SYNC-RCVD的状态,同时也收到了来自服务器的SYN=1的包,便回传给服务器一个ACK包,表示请求已收到,此时客户端和服务器建立了连接;
    
  3. 浏览器发送HTTP请求:请求行、请求头、空行、请求数据;

  4. 服务器响应HTTP请求:响应行、响应头、空行、响应数据;

  5. 浏览器解析响应数据并渲染;

  6. 释放TCP连接,发起TCP的四次挥手;

     1. 第一次挥手:客户端向服务器发送FIN=1包,表示请求释放连接,进入到FIN-WAIT(终止等待)状态;
     2. 第二次挥手:服务器收到FIN=1包,回传给客户端ACK=1包,表示请求已收到,由于当前服务器可能正在向服务器发送数据,所以服务器在接收了客户端的FIN=1的包后,就只能发送ACK=1的包表示收到请求,此时服务器进入到CLOSE-WAIT(关闭等待)状态,此时客户端向服务器的方向就释放了连接,表示客户端不能再向服务器发送数据了,但是服务器依然可以向客户端发送数据;
     3. 第三次挥手:客户端收到ACK=1包后就等待服务器发送释放连接包,当服务器向客户端发送完数据后,就开始发送FIN=1包,表示释放服务到到客户端的连接,此时服务器进入到LAST-ACK(最后确认)状态;
     4. 第四次挥手:客户端收到服务器的FIN=1包后,回传给服务器ACK=1包,服务器进入到CLOSE状态,客户端进入到TIME_WAIT状态,此时TCP连接还没有释放,在等待2*MSL时间后,进入到CLOSE状态,因为客户端向服务器发送的最后一个ACK可能丢失,客户端怕ACK丢失就等待2*MSL时间,一旦在这个时间段内丢失了,那么服务器会再次发送FIN=1包,这是一个保险的做法;
    

8. 常见面试题

  1. 为什么要三次握手,不是两次握手?
    如果只用两次握手,那么一旦第二次握手发生了:服务器向客户端发送应答请求,实际客户端没收到服务器发出的请求,但是因为只有两次握手,服务器认为连接已经成功了,就开始想客户端发送数据了;而服务器迟迟没收到服务器发送的应答请求,认为连接还没有成功,就会忽略服务器发送来的数据。服务器一直在发数据,客户端不接收数据却一直在等待应答请求,就会造成了数据丢失。
  2. 为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
    因为客户端向服务器发送的最后一个ACK可能丢失,客户端怕ACK丢失就等待2*MSL时间,一旦在这个时间段内丢失了,那么服务器会再次发送FIN=1包,这是一个保险的做法。
  3. 为什么连接的时候是三次握手,关闭的时候却是四次握手?
    释放连接时,当服务器收到FIN=1包时,很可能并不会立即关闭连接,因为此时服务器可能正在向客户端发送数据,所以只能先回复一个ACK=1包,告诉Client端,“你发的FIN=1包我收到了”。只有等到服务端所有的数据都发送完了,才能发送FIN=1包,因此不能一起发送。故需要四步挥手。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值