HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。从1960年发展至今,共有三个版,HTTP/0.9 已过时的版本。只接受 GET 一种请求方法,没有在通讯中指定版本号,且不支持请求头。由于该版本不支持 POST 方法,所以客户端无法向服务器传递太多信息。HTTP/1.0 这个版本是第一个在通讯中指定版本号的HTTP 协议版本,至今仍被广泛采用,特别是在代理服务器中。HTTP/1.1 当前版本。持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式同时发送多个请求,以便降低线路负载,提高传输速度。
绝大多数的Web开发,都是构建在HTTP协议之上的Web应用 ,例如百度,http://www.baidu.com,准确来说是https://www.baidu.com(是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL)。人习惯记忆域名,当我想访问百度时,习惯性的输入www.然后加上"百度"的拼音"baidu",然后再加上.com,但机器间互相只认IP(互联网上每一台计算机的唯一标识)地址,因此需要把www.baidu.com转换成对应的IP地址,这个转换工作称为DNS解析,这个解析过程是如何进行的呢?
首先在本地域名服务器中查询www.baidu.com对应的IP地址,如果没有找到的情况下,本地域名服务器会向根域名服务器发送一个请求,其实,真正的网址是www.baidu.com.,这个.对应的就是根域名服务器,默认情况下所有的网址的最后一位都是.,既然是默认情况下,为了方便用户,通常都会省略,浏览器在请求DNS的时候会自动加上,接着,如果根域名服务器也不存在该域名时,本地域名会向com顶级域名服务器发送一个请求,依次类推下去。直到最后本地域名服务器得到百度的IP地址并把它缓存到本地,供下次查询使用。从上述过程中,可以看出网址的解析是一个从右向左的过程: .->com -> baidu.com -> www.baidu.com。
从上面DNS解析步骤来看,有些复杂,为了增加访问效率,DNS存在着多级缓存,浏览器缓存(Google chrome://dns),系统缓存(cmd ipconfig/displaydns),路由器缓存,IPS服务器缓存,根域名服务器缓存,顶级域名服务器缓存,主域名服务器缓存。
回到主题,通过DNS解析域名获取到百度服务器真获取实IP后,建立TCP连接,发送请求。
HTTP请求由三部分构成,请求行,请求头(消息报头),请求体(请求正文)。
下图是用抓包工具Fiddler抓取的上传文件的请求
1 POST http://localhost:8080/ HTTP/1.1 2 Host: localhost:8080 3 Connection: keep-alive 4 Content-Length: 6903 5 Cache-Control: max-age=0 6 Origin: http://localhost:8080 7 Upgrade-Insecure-Requests: 1 8 Content-Type: multipart/form-data; boundary=----WebKitFormBoundarykfTNgtyTkGnKaci9 9 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36 10 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 11 Referer: http://localhost:8080/ 12 Accept-Encoding: gzip, deflate, br 13 Accept-Language: zh-CN,zh;q=0.9 14 15 ------WebKitFormBoundarykfTNgtyTkGnKaci9 16 Content-Disposition: form-data; name="file"; filename="内网配置.png" 17 Content-Type: image/png18 ......1 请求行:上图显示的第(1)行内容。请求行以一个方法符号开头, 以空格分开, 后面跟着请求的URI 和协议的版本, 格式如下:Method Request-URI HTTP-Version CRL
其中 Method 表示请求方法; Request-URI 是一个统一资源标识符; HTTP-Version 表示请求的HTTP 协议版本; CRLF 表示回车和换行(除了作为结尾的CRLF 外,不允许出现单独的CR 或LF 字符)。
请求方法 GET 请求获取Request-URI 所标识的资源POST 在Request-URI 所标识的资源后附加新的数据HEAD 请求获取由Request-URI 所标识的资源的响应消息报头PUT 请求服务器存储一个资源,并用Request-URI 作为其标识DELETE 请求服务器删除Request-URI 所标识的资源TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断CONNECT 保留将来使用OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需
2 请求头:上图显示的第(2-13)行内容,请求头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端信息。
3 请求体:上图显示的第(15)行以后内容。
三 HTTP Reponse响应
HTTP响应也由三部分构成,响应行,响应头(消息报头),响应体(响应正文)。
1 HTTP/1.1 200 2 Content-Type: text/html;charset=UTF-8 3 Content-Language: zh-CN 4 Date: Wed, 16 May 2018 03:00:48 GMT 5 Content-Length: 568 6 7 <html> 8 <body>9 ......1 响应行:上图显示的第(1)行内容。响应行的格式如下
HTTP-Version Status-Code Reason-Phrase CRLF其中, HTTP-Version 表示服务器HTTP 协议的版本; Status-Code 表示服务器发回的响应状态代码; Reason-Phrase表示状态 代码的文本描述 。
2 响应头:上图显示的第(2-5)行内容。
3 响应体:上图显示的第(7)行以后内容。
转载于:https://www.cnblogs.com/Matchman/p/9041789.html
相关资源:Hypertext Transfer Protocol -- HTTP/1.0