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