通信之HTTP协议

HTTP协议是互联网常用的通信协议,在OSI标准中划分中属于应用层协议。而通常所说的TCP/UDP通信协议是传输层协议。HTTP是对TCP通信的封装。HTTP协议分为请求报文格式定义和响应报文格式定义。请求报文中应包含请求头和内容,响应报文中包含状态头和内容。参考(https://www.cnblogs.com/jiu0821/p/5641600.html

请求报文内容 详细说明 举例
请求行 请求行由方法字段、URL 字段 和HTTP 协议版本字段 3 个部分组成,他们之间使用空格隔开。常用的 HTTP 请求方法有 GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT;

GET / HTTP/1.1

Host:www.google.com

具体的URL需要到DNS进行解析,下层需要经过TCP的套接字传输,网络层的寻址,链路层的链接,物理层的传输校验等等一系列操作。

请求头 请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息
User-Agent:产生请求的浏览器类型。
例如:User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1

这在爬虫经常使用,通过使用代理用于访问有反爬功能服务器的网站。

Cookie信息也是放在这里的。

Accept:客户端可识别的内容类型列表。

Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机

空行 最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头  
请求数据 请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length 此部分可以省略不包含
扫描二维码关注公众号,回复: 10892486 查看本文章

响应报文格式如下:

响应报文内容 详细说明 举例
状态行

HTTP-Version Status-Code Reason-Phrase CRLF

其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。

  • 1xx:指示信息--表示请求已接收,继续处理。
  • 2xx:成功--表示请求已被成功接收、理解、接受。
  • 3xx:重定向--要完成请求必须进行更进一步的操作。
  • 4xx:客户端错误--请求有语法错误或请求无法实现。
  • 5xx:服务器端错误--服务器未能实现合法的请求。
  • 200 OK:客户端请求成功。
  • 400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
  • 401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
  • 403 Forbidden:服务器收到请求,但是拒绝提供服务。
  • 404 Not Found:请求资源不存在,举个例子:输入了错误的URL。
  • 500 Internal Server Error:服务器发生不可预期的错误。
  • 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常,举个例子:HTTP/1.1 200 OK(CRLF)。
消息报头 消息报头由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。消息报头用于表示服务器端状态信息
例子Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122

响应头可能包括Location:Location响应报头域用于重定向接受者到一个新的位置。例如:客户端所请求的页面已不存在原先的位置,为了让客户端重定向到这个页面新的位置,服务器端可以发回Location响应报头后使用重定向语句,让客户端去访问新的域名所对应的服务器上的资源;

  Server:Server 响应报头域包含了服务器用来处理请求的软件信息及其版本。它和 User-Agent 请求报头域是相对应的,前者发送服务器端软件的信息,后者发送客户端软件(浏览器)和操作系统的信息。

  Vary:指示不可缓存的请求头列表;

  Connection:连接方式;

  对于请求来说:close(告诉 WEB 服务器或者代理服务器,在完成本次请求的响应后,断开连接,不等待本次连接的后续请求了)。keepalive(告诉WEB服务器或者代理服务器,在完成本次请求的响应后,保持连接,等待本次连接的后续请求);

  对于响应来说:close(连接已经关闭); keepalive(连接保持着,在等待本次连接的后续请求); Keep-Alive:如果浏览器请求保持连接,则该头部表明希望WEB 服务器保持连接多长时间(秒);例如:Keep-Alive:300;

  WWW-Authenticate:WWW-Authenticate响应报头域必须被包含在401 (未授权的)响应消息中,这个报头域和前面讲到的Authorization 请求报头域是相关的,当客户端收到 401 响应消息,就要决定是否请求服务器对其进行验证。如果要求服务器对其进行验证,就可以发送一个包含了Authorization 报头域的请求;

Cookie的信息也是放在这里的。

空行 用以分割消息报头和响应包体  
响应包体 该部分是服务器响应内容 需要进行解析处理的部分,在python中可以将其转换为xml格式。

HTTP协议目前有0.9版本,1.0版本,1.1版本和2.0版本,这几个版本的区别是长连接的问题具体可参考https://www.cnblogs.com/yunman/p/6073367.html

HTTP协议本质还是TCP协议,需要建立连接。但是建立连接之后,什么时候结束就是一个问题了。

在TCP协议中,如果客户端(浏览器)没有数据请求之后,就向服务器发送断开连接请求,而服务器也没有数据通信,服务器向客户端(浏览器)发送通信断开请求,客户端确认之后这个通信就断开了。

短连接就是通信任务完成一次就中断,长连接就是一定时间内维持连接。详细了解请参考https://www.cnblogs.com/gotodsp/p/6366163.html。在通信连接期间,如果采用短连接,便于管理,但频繁的连接请求或中断会导致,再次连接数据将不会产生记忆功能。最典型的就是游客登录界面选择物品加入购物车的过程,短连接加上HTTP的无状态性会导致每次选取的物品放入了不同的购物车。而如果采用长连接,就可以解决上述问题,通过设定HTTP协议头Connection:Keep-Alive.但是长连接会导致服务器端的资源一直被占用,进而增加服务器端的负担。为了解决这个问题,服务器端将数据状态存入cookie来记录客户端,同时将这些数据放入客户端。当该客户端再次访问服务器时就将该Cookie信息加入到请求头中,这样就实现了HTTP访问的有记忆性,实现完整的会话。Session机制也是为了完成用户跟踪 一种方式,只不过记载信息放在了服务器端。两种机制可参考https://www.cnblogs.com/andy-zhou/p/5360107.html.

发布了42 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/wangyhwyh753/article/details/89450718