Linux-应用层协议Http
Linux – 应用层协议Http
1.HTTP背景知识
HTTP协议:HTTP(HyperText Transfer Protocol,超文本传输协议)的本质是运行在 TCP/IP 协议族之上的 “应用层协议”,核心作用是定义客户端(如浏览器、APP)与服务器之间的 “数据交互格式与流程”,最终实现 “超文本(如 HTML、图片、JSON)的传输与展示”。HTTP 协议的实质:应用层的 “请求 - 响应” 通信规则。
HTTP协议是客⼾端与服务器之间通信的基础。HTTP 是 “应用层的通信语言”—— 就像两个人对话需要共同语言(如中文、英文),客户端和服务器要交互数据,也需要提前约定 “如何发起请求、如何返回响应、数据用什么格式封装”,HTTP 就是这套约定好的 “语言规则”。
客⼾端通过HTTP协议向服务器发送请求,服务器收到请求后处理并返回响应。HTTP协议是⼀个⽆连接、⽆状态的协议。“无连接” 并非 “不建立连接”,而是指 客户端与服务器的连接 “按需建立、用完即断”,不长期维持一个固定连接。“无状态” 是指 服务器对每个 HTTP 请求的处理都是 “独立的、孤立的”,不保存客户端的任何 “上下文信息”—— 即服务器无法通过前一次请求的信息,判断当前请求是否来自同一个客户端。
与我们之前实现的单纯tcp或者udp服务器不同,之前的客户端与服务器在连接以后就一直进入循环进行收发消息,而HTTP协议只会按需建立连接,处理完一次客户端的请求以后 就会断开连接。
为什么设计为无状态?核心是降低服务器负担:若服务器需要记忆每个客户端的状态(如登录状态、浏览记录),则需为每个客户端维护 “状态数据”,当并发量极高(如百万级用户)时,服务器的内存和性能会被严重消耗。
如何解决 “无状态” 的局限性?通过 “额外机制” 在无状态基础上实现 “状态保持”,最典型的是Cookie+Session。
认识URL :平时我们俗称的 “⽹址” 其实就是说的 URL
2.HTTP协议组成部分
HTTP请求通常包括四个部分:
1.请求行 [⽅法] + [url] + [版本]
2.请求报头 请求的属性, 冒号分割的键值对;每组属性之间使⽤ \r\n 分隔;遇到空⾏表⽰ Header 部分结束
3.空白行
4.请求正文 Body: 空⾏后⾯的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有⼀个 Content-Length属性来标识Body的⻓度;
HTTP响应格式与请求格式类似也是分为四个部分,只是第一行变变为状态行,且其中填写的内容有所不同。
3.HTTP的⽅法
HTTP的⽅法,常用的一般就是GET和POST方法
GET⽅法(重点)
⽤途:⽤于请求URL指定的资源。
⽰例: GET /index.html HTTP/1.1
特性:指定资源经服务器端解析后返回响应内容。
POST⽅法(重点)
⽤途:⽤于传输实体的主体,通常⽤于提交表单数据。
⽰例: 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(临时重定向)
当服务器返回HTTP 302状态码时,表⽰请求的资源临时被移动到新的位置。
同样地,服务器也会在响应中添加⼀个Location头部来指定资源的新位置。浏览器会暂时使⽤新的URL进⾏后续的请求,但不会缓存这个重定向。
总结:⽆论是HTTP 301还是HTTP 302重定向,都需要依赖Location选项来指定资源的新位置。这个Location选项是⼀个标准的HTTP响应头部,⽤于告诉浏览器应该将请求重定向到哪个新的URL地址。
示例:
HTTP/ 1.1 302 Found\r\n
Location: https: //www.new-url.com\r\n
服务器的职责仅在于通过重定向状态码和Location
字段,向浏览器传递 “临时重定向的目标地址”,不参与后续的新请求 —— 既不会主动帮浏览器访问Location
对应的 URL,也不会处理新请求的逻辑(新请求需由浏览器重新发起,服务器再按新请求的 URL 处理)。
HTTP常⻅报头Header
Content-Type: 数据类型(text/html等)
Content-Length: Body的⻓度
Host: 客⼾端告知服务器, 所请求的资源是在哪个主机的哪个端⼝上;
User-Agent: 声明⽤⼾的操作系统和浏览器版本信息;
Referer: 当前⻚⾯是从哪个⻚⾯跳转过来的;
Location: 搭配3xx状态码使⽤, 告诉客⼾端接下来要去哪⾥访问;
Cookie: ⽤于在客⼾端存储少量信息. 通常⽤于实现会话(session)的功能;
除此之外,HTTP还有一个 Connection 字段,这是HTTP报⽂头的⼀部分,它主要⽤于控制和管理客⼾端与服务器之间的连接状态。
5.实现一个简单的服务器
实现⼀个最简单的HTTP服务器, 只在⽹⻚上输出 “hello world”; 只要我们按照HTTP协议的要求构造数据, 就很容易能做到.
代码运行实例:
如果我们将状态行改成302我们会得到以下的结果,我们的页面被重定向到了百度的首页,这就是重定向的用法
6.总结
如果想要实现与客户端浏览器更多详细的交互,需要对客户端的请求进行反序列化与序列化,然后根据方法做对应的处理,以及根据请求的url将外部根目录的文件填写到正文中,这个文件可以是Html,可以是图片等,然后响应信息并进行反序列化,将信息交给浏览器渲染,这样就能够实现一些好玩的后端与前端交互的网页。我的前面文章中写了一篇基于Tcp实现一个电商网站,感兴趣也可以浏览一下。
具体的代码已经上传我的gitee,需要的可以自取
感谢浏览,如有错误可以指出。