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://www.smallessay.com/niceblog/python
URL一般包含以下部分:
- schema:协议部分,在Internet中可以使用多种协议,如HTTP,FTP。
- host: web服务器的ip地址或者域名。
- port: 服务端端口,http默认端口是80,https默认端口是443。
- path: 资源访问路径。
- query-string: 查询参数。
一次完整的HTTP请求过程
- 首先通过DNS对域名进行解析(如果是IP地址就不用解析了),DNS解析的顺序:浏览器缓存->操作系统缓存->hosts文件->DNS服务器。
- 通过TCP三次握手,浏览器与服务器端建立连接。
- 浏览器发起HTTP请求。
- 服务器响应HTTP请求。
- 浏览器解析html代码,并请求html代码中的资源(css/js/image)。
- 浏览器对页面内容进行渲染并展示。
- TCP四次挥手关闭连接。
HTTP响应报文格式

响应报文示例:
HTTP/1.1 200
Content-Type: text/html;charset=UTF-8
Content-Length: 5
Date: Fri, 06 Nov 2020 21: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: Fri, 06 Nov 2020 21:18:21 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
...