【计算机网络】理解应用层协议HTTP
目录
- HTTP协议
- 认识URL
- HTTP协议的请求
- 如果我们想获得请求报文的完整内容,怎么办?
- HTTP协议的响应
- HTTP的方法
- GETvsPOST
- HTTP的状态码
- HTTP常见Header
- HTTP版本
- 实现一个简单的HTTP服务器
HTTP协议
HTTP协议是一种超文本传输协议,它定义了客户端与服务端之间如何进行数据传输进而通信的协议,HTTP是一种可以用来解析和传输超文本的协议,
认识URL
随便找一个网址我们看一下对应的URL的格式是怎样的
对于协议方案名,我们这里学习的是http,但我们平常使用的都是https,但两者大同小异,https使用起来更安全。
对于域名,浏览器后台会自动给转换为ip地址,找到相应服务器,加上后面的带层次的文件路径,就能唯一标识网络上唯一一台主机上的唯一的文件资源,即互联网上的唯一文件资源。
域名后面其实还有端口号,但端口号跟协议名称是强关联的,我们不需要看到,后台会自动拼接。
对于?后面的一些字符串我们不需要知道,这些都是编码格式。
HTTP协议的请求
- 首行(请求行):方法 + url + HTTP版本
- Header(请求报头):请求的属性,每组属性是":"分隔的kv键值对,每组属性用\r\n分开,遇到空行表示Header部分结束。
- Body行(请求正文):Body后面跟的都是Body,Body允许为空字符串,如果Body存在,则在Header中会有一个Content-Length 的属性来标识Body的长度。
如果我们想获得请求报文的完整内容,怎么办?
假如我们从网络中截获一段网络报文,我们如何知道这串报文是一个完整的请求报文呢?
我们可以按照换行符为分隔符,如果拿到空行,就说明我们已经拿到了请求报头部分,再从请求报头中拿到Content-Length属性就能知道Body数据的大小了,从而就能拿到完整的报文。
下面是一个截获的报文
上面就是一个GET请求的报文。
HTTP协议的响应
- 首行(状态行):版本号 + 状态码 + 状态码描述
- Header(响应报头):回应的属性,每组属性是":"分隔的kv键值对,每组属性用\r\n分开,遇到空行表示Header部分结束。
- Body(响应正文): 空行后面的内容都是 Body. Body 允许为空字符串. 如果 Body 存在, 则在Header 中会有一个 Content-Length 属性来标识 Body 的长度; 如果服务器返回了一个 html 页面, 那么 html 页面内容就是在 body 中.
应答响应格式
HTTP的方法
HTTP的方法都是请求时使用,HTTP的方法众多
其中GET和POST是重点理解的两个方法,其他方法不常用,了解即可。
GETvsPOST
我们在进行登陆时,使用的账号密码就可以作为参数进行传递。
- GET一般用来获取静态资源(例如html),也可以通过URL来向服务器传递参数。
- POST可以通过http request的正文来进行参数传递。
- URL传递参数,参数的体量一定不大,正文可以很大。
- POST方法比GET方法传参更私密,但都不安全!所以需要对http的参数部分进行加密,所以就有了https。
HTTP的状态码
最常见的状态码, 比如 200(OK), 404(Not Found), 403(Forbidden), 302(Redirect, 重定向), 504(Bad Gateway)
理解重定向:
- 永久重定向:即状态码为301,表示请求的资源已经被永久的移动到新的位置,在这种情况下,服务器会在响应中添加一个Location头部,用于指定资源的新位置,这个Location包含了新的URL地址,以后浏览器会自动重定向到指定的地址。
- 临时重定向:即状态码为302,表示请求的资源被暂时移动到新的位置,同样的,服务器会在响应中添加一个Location头部,用于暂时指定资源的新位置,浏览器会使用新的URL来重定向指定的地址,但不会缓存这个重定向。
- 总之:无论是 HTTP 301 还是 HTTP 302 重定向, 都需要依赖 Location 选项来指定资源的新位置。 这个 Location 选项是一个标准的 HTTP 响应头部, 用于告诉浏览器应该将请求重定向到哪个新的 URL 地址。
HTTP常见Header
- Content-Type: 数据类型(text/html 等)
- Content-Length: Body 的长度
- Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
- User-Agent: 声明用户的操作系统和浏览器版本信息;
- referer: 当前页面是从哪个页面跳转过来的;
- Location: 搭配 3xx 状态码使用, 告诉客户端接下来要去哪里访问;
- Cookie: 用于在客户端存储少量信息(比如存储账号密码,使得后续再次进入无需登录). 通常用于实现会话(session)的功能;
- connection: 用于控制和管理客户端与服务器之间的连接状态。
- Connection: keep-alive:表示希望保持连接以复用 TCP 连接(长连接)
- Connection: close:表示请求/响应完成后,应该关闭 TCP 连接(短连接)
HTTP/1.1: 在 HTTP/1.1 协议中, 默认使用持久连接。 当客户端和服务器都不明确指定关闭连接时, 连接将保持打开状态, 以便后续的请求和响应可以复用同一个连接,而HTTP/1.0: 在 HTTP/1.0 协议中, 默认连接是非持久的。 如果希望在 HTTP/1.0上实现持久连接, 需要在请求头中显式设置 Connection: keep-alive。
HTTP版本
- HTTP/0.9:仅支持GET请求,无请求与响应的报头,仅支持纯文本传输。
- HTTP/1.0:引入POST和HEAD方法,请求和响应头信息,支持多种数据格式,支持缓存、状态码、字符集等。
- HTTP/1.1:在1.0基础上增加了长连接、管道化、缓存控制。
- HTTP/2.0:多路复用、二进制帧格式、头部压缩、服务器推送等功能的引入。
- HTTP/3.0:使用 QUIC 协议替代 TCP 协议, 基于 UDP 构建的多路复用传输协议,减少了 TCP 三次握手及 TLS 握手时间, 提高了连接建立速度,解决了 TCP 中的线头阻塞问题, 提高了数据传输效率。
实现一个简单的HTTP服务器
我的gitee仓库点击这里有源码