网络编程02 -- HTTP协议

HTTP

  • HTTP全称(Hypertext Transfer Protocol),即超文本传输协议,是应用层协议,由从客户端到服务器的请求和从服务器到客户端的响应构成;
HTTP协议的特点
  • 简单,快速,通信速快非常快;
  • 灵活:HTTP允许传输任意类型的数据对象;
  • 无连接:限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接,采用这种方式可以节省传输时间;
  • 无状态:对于事务处理没有记忆能力,无状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大,
    • 例如,客户端和服务器端是两种身份,第一次请求结束后,就断开了,第二次请求时,服务器端并没有记住之前的状态,也就是说,服务器端无法区分客户端是否为同一个人、同一个身份;
HTTP请求报文的组成部分
  • HTTP请求报文由四个部分组成,如下所示:
    • 请求行:包括请求方法、请求 URL、HTTP 协议和版本;
    • 请求头:一系列的键值对;
    • 空行:请求头之后是一个空行,通知服务器以下不再有请求头、空行后面的内容是请求体;
    • 请求体:请求的数据部分,GET没有请求数据,POST有;
  • 以一个具体的HTTP请求为例,请求报文如下:
image.png
常见的请求头字段
  • Accept
    • Accept: text/html 浏览器可以接受服务器回发的类型为 text/html
    • Accept: / 代表浏览器可以处理所有类型,(一般浏览器发给服务器都是发这个)
  • Accept-Encoding
    • Accept-Encoding: gzip, deflate 浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate)
  • Accept-Language
    • Accept-Language:zh-CN,zh;q=0.9 浏览器申明自己接收的语言
  • Connection
    • Connection: keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接;
    • Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接
  • Host(发送请求时,该报头域是必需的)
    • Host: www.baidu.com 请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的;
  • Referer
    • User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36 告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本;
  • Cache-Control
    • Cache-Control:private 默认为private 响应只能够作为私有的缓存,不能再用户间共享;
    • Cache-Control:public 响应会被缓存,并且在多用户间共享。正常情况, 如果要求HTTP认证,响应会自动设置为 private;
    • Cache-Control:must-revalidate 响应在特定条件下会被重用,以满足接下来的请求,但是它必须到服务器端去验证它是不是仍然是最新的;
    • Cache-Control:no-cache 响应不会被缓存,而是实时向服务器端请求资源;
    • Cache-Control:max-age=10 设置缓存最大的有效时间,但是这个参数定义的是时间大小(比如:60)而不是确定的时间点。单位是[秒 seconds];
    • Cache-Control:no-store 在任何条件下,响应都不会被缓存,并且不会被写入到客户端的磁盘里,这也是基于安全考虑的某些敏感的响应才会使用这个;
  • Cookie
    • Cookie是用来存储一些用户信息以便让服务器辨别用户身份的(大多数需要登录的网站上面会比较常见),比如cookie会存储一些用户的用户名和密码,当用户登录后就会在客户端产生一个cookie来存储相关信息,这样浏览器通过读取cookie的信息去服务器上验证并通过后会判定你是合法用户,从而允许查看相应网页。当然cookie里面的数据不仅仅是上述范围,还有很多信息可以存储是cookie里面,比如sessionid等;
  • Range(用于断电续传)
    • Range:bytes=0-5 指定第一个字节的位置和最后一个字节的位置。用于告诉服务器自己想取对象的哪部分;
常见的请求方法
  • HTTP请求方法通常有8种,分别如下:
    • GET:请求指定的页面信息,并返回实体主体;
    • HEAD:类似于GET请求,只不过返回的响应中没有具体的内容,用于获取报头;
    • POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)数据被包含在请求体中,POST 请求可能会导致新的资源的建立和/或已有资源的修改;
    • PUT:从客户端向服务器传送的数据取代指定的文档的内容;
    • DELETE:请求服务器删除指定的页面;
    • CONNECT:HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器;
    • OPTIONS:允许客户端查看服务器的性能;
    • TRACE:回显服务器收到的请求,主要用于测试或诊断;
    • PATCH:是对 PUT 方法的补充,用来对已知资源进行局部更新;
  • 其中最广泛使用的是Get请求和Post请求,两者之间的区别如下:
    • Get请求的参数直接拼接在URL中,Post请求的参数放在请求体,相对安全;
    • Get请求向服务器提交数据最大为1024个字节,而Post请求对此没有限制;
HTTP响应报文的组成部分
  • HTTP响应报文由四个部分组成,如下所示:
    • 响应行:HTTP协议和版本、状态码、状态描述;
    • 响应头:一系列的键值对;
    • 空行
    • 响应体:数据内容;
  • 详细内容如下所示:
image.png
  • 常见的响应头信息有如下:
  • Cache-Control对应请求中的Cache-Control
    • Cache-Control:private 默认为private 响应只能够作为私有的缓存,不能再用户间共享;
    • Cache-Control:public 浏览器和缓存服务器都可以缓存页面信息;
    • Cache-Control:must-revalidate 对于客户机的每次请求,代理服务器必须想服务器验证缓存是否过时;
    • Cache-Control:no-cache 浏览器和缓存服务器都不应该缓存页面信息;
    • Cache-Control:max-age=10 是通知浏览器10秒之内不要烦我,自己从缓冲区中刷新;
    • Cache-Control:no-store 请求和响应的信息都不应该被存储在对方的磁盘系统中;
  • Content-Type
    • Content-Type: text/html;charset=UTF-8 告诉客户端,资源文件的类型,还有字符编码,客户端通过utf-8对资源进行解码,然后对资源进行html解析。通常我们会看到有些网站是乱码的,往往就是服务器端没有返回正确的编码;
  • Content-Encoding
    • Content-Encoding:gzip 告诉客户端,服务端发送的资源是采用gzip编码的,客户端看到这个信息后,应该采用gzip对资源进行解码;
  • Date
    • Date: Tue, 03 Apr 2018 03:52:28 GMT 这个是服务端发送资源时的服务器时间,GMT是格林尼治所在地的标准时间。http协议中发送的时间都是GMT的,这主要是解决在互联网上,不同时区在相互请求资源的时候,时间混乱问题;
  • Server
    • Server:Tengine/1.4.6 这个是服务器和相对应的版本,只是告诉客户端服务器信息;
  • Transfer-Encoding
    • Transfer-Encoding:chunked 这个响应头告诉客户端,服务器发送的资源的方式是分块发送的。一般分块发送的资源都是服务器动态生成的,在发送时还不知道发送资源的大小,所以采用分块发送,每一块都是独立的,独立的块都能标示自己的长度,最后一块是0长度的,当客户端读到这个0长度的块时,就可以确定资源已经传输完了;
  • Expires
    • Expires:Sun, 1 Jan 2000 01:00:00 GMT 这个响应头也是跟缓存有关的,告诉客户端在这个时间前,可以直接访问缓存副本,很显然这个值会存在问题,因为客户端和服务器的时间不一定会都是相同的,如果时间不同就会导致问题。所以这个响应头是没有Cache-Control:max-age=*这个响应头准确的,因为max-age=date中的date是个相对时间,不仅更好理解,也更准确;
  • Last-Modified
    • Last-Modified: Dec, 26 Dec 2015 17:30:00 GMT 所请求的对象的最后修改日期(按照 RFC 7231 中定义的“超文本传输协议日期”格式来表示)
  • Connection
    • Connection:keep-alive 这个字段作为回应客户端的Connection:keep-alive,告诉客户端服务器的tcp连接也是一个长连接,客户端可以继续使用这个tcp连接发送http请求;
  • Etag
    • ETag: "737060cd8c284d8af7ad3082f209582d" 就是一个对象(比如URL)的标志值,就一个对象而言,比如一个html文件,如果被修改了,其Etag也会别修改,所以,ETag的作用跟Last-Modified的作用差不多,主要供WEB服务器判断一个对象是否改变了。比如前一次请求某个html文件时,获得了其 ETag,当这次又请求这个文件时,浏览器就会把先前获得ETag值发送给WEB服务器,然后WEB服务器会把这个ETag跟该文件的当前ETag进行对比,然后就知道这个文件有没有改变了;
  • Refresh
    • Refresh: 5; url=http://baidu.com 用于重定向,或者当一个新的资源被创建时,默认会在5秒后刷新重定向;
  • Access-Control-Allow-Origin
    • Access-Control-Allow-Origin: * 号代表所有网站可以跨域资源共享,如果当前字段为那么Access-Control-Allow-Credentials就不能为trueAccess-Control-Allow-Origin: www.baidu.com 指定哪些网站可以跨域资源共享;
  • Access-Control-Allow-Methods
    • Access-Control-Allow-Methods:GET,POST,PUT,DELETE 允许哪些方法来访问;
  • Access-Control-Allow-Credentials
    • Access-Control-Allow-Credentials: true 是否允许发送cookie,默认情况下,Cookie不包括在CORS请求之中。设为true,即表示服务器明确许可,Cookie可以包含在请求中,一起发给服务器,这个值也只能设为true,如果服务器不要浏览器发送Cookie,删除该字段即可,如果access-control-allow-origin为*,当前字段就不能为true;
  • Content-Range
    • Content-Range: bytes 0-5/7877 指定整个实体中的一部分的插入位置,他也指示了整个实体的长度,在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度;

HTTPS

  • HTTPS = HTTP + SSL,HTTPS是在HTTP协议的基础上增加了一层SSL加密认证,保证了客户端与服务端之间数据传输的安全性;
  • 关于CA证书认证机构,公钥,私钥,对称加密与非对称加密,详情可见iOS 逆向13 -- 签名机制
  • HTTPS的工作流程如下:
    • 服务端向CA证书认证机构申请,颁发自己的数字证书(标识自己身份),数字证书中包含服务端的公钥;
    • 客户端发送请求到服务端,经过TCP三次握手,建立联接;
    • 服务端将自己的数字证书传输给客户端;
    • 客户端接收到数字证书,向CA进行验证,确定此证书是不是服务端的,若验证通过,则获取数字证书中服务端的公钥;
    • 客户端随机生成一个会话密钥用服务端的公钥进行加密,然后传输给服务端;
    • 服务端拿到客户端的数据,用自己的私钥进行解密,得到会话密钥;
    • 之后客户端与服务端之间的数据传输使用会话密钥进行加密,解密,属于对称加密,提高数据的传输效率;
    • 其中会话密钥的传输使用的是非对称加密,之后客户端与服务端之间的数据通信使用的是对称加密
image.png

你可能感兴趣的:(网络编程02 -- HTTP协议)