转载自https://www.cnblogs.com/FudgeBear,他的课堂笔记很好,为了加深记忆,我也在word中跟着重新打了一遍。
abstract:HTTP协议的特性,HTTP请求/响应的过程,HTTP请求/响应的报文格式等知识,最后会演示如何通过Chrome提供的开发者工具,去跟踪调试一次HTTP请求。
HTTP protocol:是1个请求响应式协议
Client –-> server : http 请求
Client <-- server : http 响应
1个request + 1个 response = 1个http事务
任意2个http事务都是independent的 –> 无状态
协议分层:不同的协议完成不同的功能
多种分层模型:TCP/IP协议栈分层模型,OSI分层模型(7层),etc
TCP/IP分层模型:
(Application Layer)应用层协议:比如HTTP protocol
(Transport Layer)传输层协议:比如TCP protocol(保证数据传输有序可靠的协议)--端口号,默认80
(Network Layer)网络层协议:定位,比如ip地址,IP地址一般比较不好记忆,可以用对应的域名。(域名到IP地址之间的解析:由DNS(domin Name System)Server来完成)
通过域名以及端口号可以定位到唯一服务。
(Host-to-network Layer)数据链路层&物理传输层:数据传输
浏览网页的过程模拟:
域名:example.com
-->DNS服务器
IP地址:93.184.216.34
浏览器connect to 服务器端(IP地址已告知):TCP连接
连接建立成功
浏览器端向服务器端发起HTTP请求
服务器端可以做出对应的HTTP响应
浏览器端渲染并展示HTML文件
使用抓包工具抓到
HTTP请求包(报文):
HTTP请求行: GET / HTTP/1.1
GET --- 请求方法:get,post,head,put,options,delete,trace,connect
/ --- 资源路径
HTTP/1.1 --- HTTP协议版本(目前常用1.1)
\r\n --- 文本结尾(换行)
HTTP请求头:从Host到最后一行
格式:key:value \r\n
Host --- 域名,主机名
Connection --- 使用keep-alive 一个连接可以发多个请求,请求结束可以不disconnect
User-Agent --- 发起请求的应用程序(服务端决定返回的版本(pc或者phone)
HTTP响应(报文格式):
状态行 --- HTTP/1.1 200 OK \r\n
HTTP/1.1 --- 协议版本
200 --- 状态码:表示HTTP响应的状态
OK --- 原因
常见状态码:
200 OK:请求成功(一般以2开头的都是表示请求成功)
304 Not Modified:(请求码与缓存相关:如果浏览器端有缓存时,在请求服务端对应资源时,服务器不用再次返回。)
一般以3开头的状态码都是与重定向以及缓存相关的。
404 Not Found:(服务器找不到资源)
500 Internal Server Error:(服务器端在请求时出错了)(一般开头表示服务器内部的错误)
\r\n --- 表示结束符
响应头 --- 从Aceept-Ranges 到 Content-Length
格式与请求头的格式类似
比如:
Server – 服务器端用什么应用程序来返回响应
Content-Type:资源内容的类型(如HTML,音频,视频等)
Content-Length:内容长度(如果一条连接上有多个请求的话,需要指定1个资源长度来找边界)
响应体 --- 响应头之后的部分
响应头跟响应体的分隔符:空行(\r\n)
响应体可以是文本或者二进制,一般情况下大小由Content-Length来指定。
通过Chrome浏览器开发者工具来跟踪响应的过程:
打开开发者工具,选择Network选项。
会得到一个HTTP请求过程。(注意,假如再次刷新网页,状态码显示304,此时勾选Disable cache,则状态码会变为200)
大神的作业:
HTTP协议单元测验:https://my.oschina.net/iwinder/blog/779717
HTTP协议单元作业:https://my.oschina.net/hava/blog/734416