飞道的博客

HTTP协议报文结构

489人阅读  评论(0)

HTTP协议

HTTP协议(Hyper Text Transfer Protocol,超文本传输协议),是用于从万维网(WWW:World Wide Web)服务器传输超文本到本地浏览器的传送协议,是一种应用层的协议。

URL与URI的区别

统一资源标识符URI(uniform resource identifier):用来唯一标识一个资源,这个资源可以一个名字(URN)、一串编号、一个地址(URL)…

统一资源定位符URL(uniform resource locator):用来唯一定位一个资源,这个资源是一个网络上地址。

URI是一种抽象,URL是URI的一种具体实现,URI是URL的超集,URI包含URL。

一个完整的URL

下面是一个完整的URL:

https://blog.csdn.net/u022812849/article/details/107067859#t6

URL一般包含以下部分:

  • schema:协议部分,在Internet中可以使用多种协议,如HTTP,FTP。
  • host: web服务器的ip地址或者域名。
  • port: 服务端端口,http默认端口是80,https默认端口是443。
  • path: 资源访问路径。
  • query-string: 查询参数。

具体HTTP协议的格式可以参考RFC2616:https://tools.ietf.org/html/rfc2616。

一次完整的HTTP请求过程

  1. 首先通过DNS对域名进行解析(如果是IP地址就不用解析了),DNS解析的顺序:浏览器缓存->操作系统缓存->hosts文件->DNS服务器。
  2. 通过TCP三次握手,浏览器与服务器端建立连接。
  3. 浏览器发起HTTP请求。
  4. 服务器响应HTTP请求。
  5. 浏览器解析html代码,并请求html代码中的资源(css/js/image)。
  6. 浏览器对页面内容进行渲染并展示。
  7. TCP四次挥手关闭连接。

HTTP请求报文格式

请求报文示例:

GET / HTTP/1.1
Host: localhost:8899
Proxy-Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
Sec-Fetch-User: ?1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9

请求方法:

  • GET:主要用于获取信息,查询参数会拼接在URL中,显示在浏览器地址栏。
  • POST:主要用于提交表单,提交的内容会包含在正文中。
  • PUT:主要用于更新资源。
  • DELETE:主要用于删除资源。

HTTP响应报文格式


响应报文示例:

HTTP/1.1 200
Content-Type: text/html;charset=UTF-8
Content-Length: 5
Date: Mon, 02 Nov 2020 03:18:21 GMT
Keep-Alive: timeout=60
Connection: keep-alive

hello

状态码类别:

类别 说明
1xx Informational(信息性状态码) 接收的请求正在处理
2xx Success(成功状态码) 请求正常处理完毕
3xx Redirection(重定向状态码) 需要进行附加操作以完成请求
4xx Client Error(客户端错误状态码) 服务器无法处理请求
5xx Server Error(服务器错误状态码) 服务器处理请求出错

常见状态码:

状态码 描述 说明
100 Continue 上传大文件前使用
101 Switch Protocols 升级协议使用
102 Processing 服务正在处理
200 OK 成功返回响应
201 Created 有新资源在服务器端创建成功
301 Moved Permanently 资源永久性的重定向到另一个URI中
304 Not Modified 资源未被修改,可以复用缓存
400 Bad Request 请求格式错误
401 Unauthorized 用户信息认证失败
403 Forbidden 服务器没有权限执行此请求
404 Not Found 服务器没有找到对应的资源
405 Method Not Allowed 服务器不支持请求行中的method方法
500 Internal Server Error 服务器内部错误
502 Bad Gateway 代理服务器无法获取到合法响应
503 Service Unavailable 服务器尚未准备好处理当前请求

使用命令模拟http协议

使用Telnet模拟http协议。

# telnet 10.1.9.98 8899
Trying 10.1.9.98...
Connected to 10.1.9.98.
Escape character is '^]'.
GET / HTTP/1.0

HTTP/1.1 200 
Content-Type: text/plain;charset=UTF-8
Content-Length: 5
Date: Mon, 02 Nov 2020 03:55:01 GMT
Connection: close

hello

使用文件描述符模拟http协议:

# cd /proc/$$/fd
# exec 8<> /dev/tcp/www.baidu.com/80
# echo -e 'GET / HTTP/1.0\n' >& 8
# cat <& 8
...

转载:https://blog.csdn.net/u022812849/article/details/109448389
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场