Linux -- 应用层协议Http
1.HTTP背景知识
HTTP协议:HTTP(HyperText Transfer Protocol,超文本传输协议)的本质是运行在 TCP/IP 协议族之上的 “应用层协议”,核心作用是定义客户端(如浏览器、APP)与服务器之间的 “数据交互格式与流程”,最终实现 “超文本(如 HTML、图片、JSON)的传输与展示”。HTTP 协议的实质:应用层的 “请求 - 响应” 通信规则。
为什么设计为无状态?核心是降低服务器负担:若服务器需要记忆每个客户端的状态(如登录状态、浏览记录),则需为每个客户端维护 “状态数据”,当并发量极高(如百万级用户)时,服务器的内存和性能会被严重消耗。
如何解决 “无状态” 的局限性?通过 “额外机制” 在无状态基础上实现 “状态保持”,最典型的是Cookie+Session。

2.HTTP协议组成部分
1.请求行 [⽅法] + [url] + [版本]
2.请求报头 请求的属性, 冒号分割的键值对;每组属性之间使⽤ \r\n 分隔;遇到空⾏表⽰ Header部分结束
3.空白行
4.请求正文 Body: 空⾏后⾯的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有⼀个Content-Length属性来标识Body的⻓度;

3.HTTP的⽅法

⽤途:⽤于请求URL指定的资源。
⽰例: GET /index.html HTTP/1.1
特性:指定资源经服务器端解析后返回响应内容。
⽤途:⽤于传输实体的主体,通常⽤于提交表单数据。
⽰例: POST /submit.cgi HTTP/1.1
特性:可以发送⼤量的数据给服务器,并且数据包含在请求体中。
4.HTTP的状态码
我们常用的状态码有404(Not Found),200(OK),403((Forbidden), 302(Redirect, 重定向), 504(Bad Gateway)
HTTP状态码301(永久重定向)和302(临时重定向)都依赖Location选项。以下是关于两者依赖 Location选项的详细说明:
HTTP状态码301(永久重定向)
当服务器返回HTTP 301状态码时,表⽰请求的资源已经被永久移动到新的位置。在这种情况下,服务器会在响应中添加⼀个Location头部,⽤于指定资源的新位置。这个Location头部包含了新的URL地址,浏览器会⾃动重定向到该地址。
当服务器返回HTTP 302状态码时,表⽰请求的资源临时被移动到新的位置。同样地,服务器也会在响应中添加⼀个Location头部来指定资源的新位置。浏览器会暂时使⽤新的URL进⾏后续的请求,但不会缓存这个重定向。
示例:HTTP/1.1 302 Found\r\nLocation: https://www.new-url.com\r\n
服务器的职责仅在于通过重定向状态码和Location
字段,向浏览器传递 “临时重定向的目标地址”,不参与后续的新请求 —— 既不会主动帮浏览器访问Location
对应的 URL,也不会处理新请求的逻辑(新请求需由浏览器重新发起,服务器再按新请求的 URL 处理)。
Content-Type: 数据类型(text/html等)Content-Length: Body的⻓度Host: 客⼾端告知服务器, 所请求的资源是在哪个主机的哪个端⼝上;User-Agent: 声明⽤⼾的操作系统和浏览器版本信息;Referer: 当前⻚⾯是从哪个⻚⾯跳转过来的;Location: 搭配3xx状态码使⽤, 告诉客⼾端接下来要去哪⾥访问;Cookie: ⽤于在客⼾端存储少量信息. 通常⽤于实现会话(session)的功能;
5.实现一个简单的服务器


如果我们将状态行改成302我们会得到以下的结果,我们的页面被重定向到了百度的首页,这就是重定向的用法
6.总结
如果想要实现与客户端浏览器更多详细的交互,需要对客户端的请求进行反序列化与序列化,然后根据方法做对应的处理,以及根据请求的url将外部根目录的文件填写到正文中,这个文件可以是Html,可以是图片等,然后响应信息并进行反序列化,将信息交给浏览器渲染,这样就能够实现一些好玩的后端与前端交互的网页。我的前面文章中写了一篇基于Tcp实现一个电商网站,感兴趣也可以浏览一下。
具体的代码已经上传我的gitee,需要的可以自取study_code: 学习路上写的一些代码 - Gitee.com
感谢浏览,如有错误可以指出。