文章目录
- Linux网络
- 1. 应用层
- 2. HTTP协议
- 2.1 URL
- 2.2 urlencode和urdecode
- 2.3 HTTP协议格式
- 2.4 HTTP的方法
- 2.5 HTTP的状态码
- 2.6 HTTP常见Header
Linux网络
1. 应用层
应用层是 OSI 七层模型或 TCP/IP 四层模型中的最高层,它直接为用户的应用程序提供服务。
应用层的主要作用是实现不同应用进程之间的通信和交互,使得用户能够通过网络获取所需的信息或完成各种任务。
协议是一种 “约定”。socket api的接口,在读写数据时,都是按 “字符串” 的方式来发送接收的,如果我们要传输一些"结构化的数据" ,此时就要使用我们的应用层协议。
应用层协议:
应用层协议则是定义了应用程序之间通信的规则和数据格式。
常见的应用层协议有 HTTP(用于网页浏览)、FTP(文件传输)、SMTP(电子邮件发送)、POP3(电子邮件接收)等。
例如,当您在浏览器中输入网址访问网页时,浏览器就会使用 HTTP 协议与服务器进行通信,按照 HTTP 协议规定的格式和规则来请求和接收网页数据。
我们只要保证,由一端发送构造的数据,在另一端能够正确的进行解析,就是ok的,这种约定,就是应用层协议。
2. HTTP协议
HTTP 协议(超文本传输协议)
HTTP 协议是用于在万维网(World Wide Web)上进行通信的核心协议。
它是一种基于请求 - 响应模式的应用层协议,客户端(通常是浏览器)向服务器发送 HTTP 请求,服务器则返回相应的 HTTP 响应。
HTTP 请求:
请求包含三部分:请求行、请求头和请求体。请求行指明了请求方法(如 GET、POST、PUT、DELETE 等)、请求的资源 URL 和使用的 HTTP 版本。请求头包含了关于客户端和请求的各种信息,例如客户端支持的语言、编码方式等。请求体通常在 POST 等方法中用于传输数据。
2.1 URL
URL(统一资源定位符)是用于标识互联网上资源位置的字符串。
它就像是一个地址,告诉浏览器或其他网络应用程序如何找到特定的资源,如网页、图片、文件等。
互联网上的所有资源都具有一个唯一的名称标识,这个标识叫URL。
URL 通常由以下几个部分组成:
协议:如 http(超文本传输协议)、https(安全的超文本传输协议)、ftp(文件传输协议)等,指明了访问资源所使用的规则和方法。
域名或 IP 地址:表示资源所在的服务器地址。例如,www.baidu.com 或 192.168.0.1 。
端口号(可选):如果使用的不是默认端口(如 http 的 80 端口,https 的 443 端口),则需要指定端口号。
路径:服务器上资源的具体位置。
查询字符串(可选):用于向服务器传递参数,以获取特定的资源或执行特定的操作。
片段标识符(可选):用于指定文档内的特定部分。
例如,https://www.example.com/page?param1=value1¶m2=value2#section 这个 URL 中:
https 是协议。
www.example.com 是域名。
/page 是路径。
?param1=value1¶m2=value2 是查询字符串。
#section 是片段标识符。
2.2 urlencode和urdecode
像 / ? : 等这样的字符,已经被url当做特殊意义理解了,因此这些字符不能随意出现。
比如,某个参数中需要带有这些特殊字符,就必须先对特殊字符进行转义。
转义的规则如下:
将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式。
如 “+” 被转义成了 “%2B”
urlencode(URL 编码)
urlencode 是一种将字符串转换为符合 URL 格式的编码方式。 它的主要目的是将可能在 URL 中引起歧义或不被支持的字符进行编码,以确保 URL 的正确传输和解析。
例如,空格会被编码为 %20 ,特殊字符如 & 会被编码为 %26 等。这样可以避免这些字符在 URL 中被误解为分隔符或具有其他特殊含义。
urldecode(URL 解码)
urldecode 则是 urlencode 的逆过程,它将经过编码的 URL 字符串还原为原始的字符串。
比如,接收到一个编码后的 URL
https%3A%2F%2Fwww.example.com%2Fsearch%3Fq%3Dhello%2Bworld ,通过 urldecode 可以将其解码为 https://www.example.com/search?q=hello world 。
2.3 HTTP协议格式
请求报文格式:
请求行:包含请求方法(如 GET、POST、PUT、DELETE 等)、请求的 URL 以及使用的 HTTP 版本,例如:GET /index.html HTTP/1.1 。
请求头:由一系列键值对组成,每行一个,例如:Host: www.example.com 、User-Agent: Mozilla/5.0 等,用于提供关于请求的附加信息,如客户端的类型、支持的语言等。
空行:用于分隔请求头和请求体。
请求体:在 POST 等请求方法中用于传输数据,其内容的格式由 Content-Type 请求头指定。
响应报文格式:
状态行:包含 HTTP 版本、状态码(如 200 OK、404 Not Found 等)和状态描述,例如:HTTP/1.1 200 OK 。
响应头:与请求头类似,也是一系列的键值对,如 Content-Type: text/html 、Content-Length: 1234 等,用于提供关于响应的信息。
空行:分隔响应头和响应体。
响应体:包含服务器返回给客户端的实际数据,如网页的 HTML 代码、图片的二进制数据等。
2.4 HTTP的方法
HTTP 定义了多种方法,用于指定对资源的操作类型。
2.5 HTTP的状态码
1xx 信息性状态码
这类状态码表示服务器正在处理请求。
100 Continue:表示客户端应当继续发送请求。通常在发送大文件或分块请求时使用。
2xx 成功状态码:
表示请求已成功被服务器接收、理解、并接受。
200 OK:最常见的成功状态码,表示请求成功,响应包含请求的资源。
201 Created:表示请求成功并且服务器创建了新的资源。
204 No Content:表示服务器成功处理了请求,但没有返回任何内容。
3xx 重定向状态码:
表示需要客户端采取进一步的操作以完成请求。
301 Moved Permanently:表示请求的资源已被永久移动到新的 URL,客户端应使用新的 URL 访问。
302 Found:表示请求的资源临时被移动到了其他位置。
304 Not Modified:表示客户端的缓存版本仍然有效,服务器未返回新内容。
4xx 客户端错误状态码:
表示客户端的请求包含错误语法或无法完成请求。
400 Bad Request:表示服务器无法理解客户端的请求。
401 Unauthorized:表示请求需要用户认证。
403 Forbidden:表示服务器拒绝访问,尽管客户端已通过认证。
404 Not Found:表示服务器未找到请求的资源。
5xx 服务器错误状态码:
表示服务器在处理请求时发生内部错误。
500 Internal Server Error:表示服务器内部错误,无法完成请求。
502 Bad Gateway:表示作为网关或代理的服务器从上游服务器收到无效的响
应。
503 Service Unavailable:表示服务器暂时无法处理请求,通常是由于过载或维护。
2.6 HTTP常见Header
HTTP 请求头:
User-Agent: 提供有关发起请求的客户端的信息,包括浏览器类型、版本、操作系统等。
例如:User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: 告知服务器客户端能够接受的内容类型。
例如:Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,/;q=0.8
Accept-Language: 指定客户端偏好的语言。
例如:Accept-Language: en-US,en;q=0.5
Accept-Encoding: 表明客户端支持的内容编码方式。
例如:Accept-Encoding: gzip, deflate, br
Referer: 提供当前请求页面的来源页面的 URL。
例如:Referer: https://www.example.com/page1.html
Cookie: 包含客户端发送给服务器的 Cookie 信息。
例如:Cookie: session_id=12345; user_id=6789
HTTP 响应头:
Content-Type: 指明响应体的内容类型。
例如:Content-Type: text/html; charset=UTF-8
Content-Length: 表示响应体的长度(以字节为单位)。
例如:Content-Length: 1234
Server: 标识处理请求的服务器软件。
例如:Server: Apache/2.4.41 (Ubuntu)
Location: 用于重定向,提供重定向的目标 URL。
例如:Location: https://www.newpage.com
Set-Cookie: 服务器向客户端设置 Cookie。
例如:Set-Cookie: user_name=John; expires=Thu, 01 Jan 2025 00:00:00 GMT; path=/
Cache-Control: 控制缓存策略。
例如:Cache-Control: max-age=3600, public