一.URL解析
URL:统一资源定位符。用于定位和标识互联网上的资源,如页面,图片,视频等。
它由几个部分构成:
1.协议:
在网络上进行通讯和数据交换的约定和规则,例如http,https,ftp等。
协议定义了数据的格式,传输方式,错误检测和纠正等方面的规范,以确保不同设备和系统之间能够相互理解和进行有效的通信。
A.数据格式:
(1)数据类型:例如整数,浮点数,字符串,布尔值等。
(2)数据编码:数据从一种表达形式转换为另一种表达形式的方式。例如ASCLL,Unicode,UTF-8.
(3)数据结构:规定数据的层次结构,字段的顺序,字段的大小,字段之间的关系。例如:数组,对象,列表,键值对等。
(4)数据序列化:数据转换为可传输或存储格式的过程,以及将数据从传输或存储格式还原回原始数据的过程。例如:JSON,XML,Protocol Buffers等。
(5)数据校验:确保接受数据的完整性和准确性。例如:校验和,哈希函数,数字签名等机制。
(6)数据检测和纠正:规定错误检测和纠正机制,帮助接收方检测和纠正数据传输过程中可能出现的错误。常见的机制包括奇偶校验,循环冗余校验(CRC),向前纠错码等。
B.传输方式:
(1)无连接传输和面向连接传输:每次传送数据时,发送方和接受方都不需要建立持久的连接,每个数据包都是独立传输的。面向连接传输在传送链接前需要建立一个连接,并在数据传输完毕后在释放连接。tcp是面向连接的传输协议,udp是无连接传输协议。
(2)单播,广播和组播:单播传输是指将数据从一个发送方传递到一个指定的接收方,广播传输将数据传送给网络中的所有设备,而组播传输则是将数据传送给特定的组或多个指定的接收方。
(3)流式传输和报文传输:流式传输是指将数据作为连续的字节流进行传送,而报文传输则是将数据分割为独立的数据块(报文)进行传送。TCP使用流式传输,而UDP通常使用报文传输。
(4)可靠传输和不可靠传输:可靠传输确保数据在传送过程中不会丢失,而且会按正确的顺序到达接收方。TCP是一种可靠传输协议,它使用确认和重传机制来确保数据的可靠性。相比之下,不可靠传输不保证数据的可靠性,可能会导致数据丢失或乱序。UDP是一种不可靠传输协议。
(5)分段传输和重组传输:在传输较大的数据时,协议可以将数据分段传输,然 后在接收端重新组装这些数据段。这样可以更高效地传送大量数据。
C.错误检测与纠正:
(1)校验和:校验和是一种简单的错误检测机制,它通过计算数据的校验和值,并将其附加到数据中。接收方在接收数据时重新计算校验和,并与发送方发送的校验和进行比较,以检测数据是否在传输过程中发生了错误。
(2)循环冗余检测 (CRC):CRC是一种更强大的错误检测技术,它通过在数据中添加冗余位来计算校验值。接收方使用相同的CRC算法来计算接收到的数据的校验值,并与发送方发送的校验值进行比较,以检测错误。
(3)前向纠错 (Forward Error Correction, FEC):FEC是一种纠正错误的技术,在发送数据时通过添加冗余信息来提供冗余度,以便接收方可以在一定程度上纠正错误。FEC技术通常使用纠错码,例如海明码或卷积码。
(4)重传机制:重传机制用于在发现数据包丢失或损坏时重新发送数据。例如,TCP协议使用确认和重传机制来确保数据的可靠传输。当发送方未收到接收方的确认或检测到数据包丢失时,它会重新发送相应的数据包,以确保数据的完整性。
2.主机名:由一串字符组成,通常是字母,数字和连字符。可以是一个域名或一个局域网内的设备名称。在网络中标识和定位设备。当我们在浏览器中输入一个网址,浏览器会将主机名解析为一个ip地址,以便准确找到目标设备进行通信。
1.如何解析主机名?
通常在计算机网络中的DNS服务器上进行。
DNS解析:
a.操作系统检查缓存。当在浏览器或其他应用程序输入一个主机名,操作系统首先检查本地缓存书否存储ip,如果有,直接使用,跳过后续解析。
b.发送请求。操作系统向DNS服务器发送查询请求,DNS服务器通常由你的网络服务供应商或其他网络设置指定。
c.DNS检查缓存,如果有匹配记录,直接返回ip地址。
d.如果没有,向更高级DNS服务器发送查询请求,直到找到负责该主机名区域的权威DNS服务器
e.权威DNS服务器检查数据记录,找到ip,传回发起查询的DNS服务器。
f.将ip传回操作系统,操作系统保存到自己缓存,并传给应用系统,创建连接。
主机名可以映射一个或多个ip地址,主机名通常与域名相关联,域名是一个层次化的命名系统,用于将主机名和ip地址相对应
2.什么是域名?
域名是由多个部分组成的层次化命名系统,用于将特定名称和相应ip地址相关联。
组成成分:
a.顶级域:通常表示域名分类或所属的国家/地区。例如:.com表示商业类域名,.org表示非营利组织,.net表示网络服务,.cn表示中国等。每个顶级域由一个顶级名服务器管理。
b.二级域:域名的核心部分,通常表示特定的组织,企业,品牌或个人。
c.子域:进一步细分和组织网站的不同部分或子分类。
d.主机名:指定了具体的服务器或设备名称。
3.端口号:
端口号是在网络通信中用于标识特定应用程序或服务的数字标识符。它是一个16位的整数,范围从0-65535。在tcp/ip网络协议中,端口号用于在主机上区分不同的应用程序或服务,以便正确的将网络数据包传送到目标应用程序。
常见端口号级关联应用程序或服务:
20,21:FTP(文件传输协议,用于文件传输)。
22:SSH(安全外壳协议)用于远程登录和安全文件传输。
25:SMTP(简单邮件传输协议)用于发送电子邮件。
80:HTTP(超文本传输协议)用于web浏览器和web浏览器之间的通信。
443:HTTPS(安全超文本协议)加密的http。
110:POP3(邮局协议版本3)用于接受电子邮件。
143:IMAP(互联网消息访问协议)用于接受和管理电子邮件。
3306:MySQL
3389:远程桌面协议(RDP)用于远程访问计算机桌面。
当计算机受到网络数据包时,它会查看目标端口号,并将数据包传递给相应的应用程序或服务。
通过不同端口进行区分,在同一台主机上可以同时运行多个应用程序或服务
4.路径:
路径指的是URL中主机名之后的部分,用于定位特定的资源或页面。它描述了资源在服务器上的位置和层次结构。
5.查询参数:
位于路径之后的部分,用于向服务器传递额外的数据或参数,以便服务器跟据这些参数处理请求和生成相应的响应,执行特定的操作,如过滤数据,实现分页等。通常以?开头,有多个键值对组成,每个键值对用&分割。
查询参数的格式为 key=value
,其中 key
是参数的名称,value
是参数的值。多个查询参数可以同时存在,并按照键值对的方式进行表示。
例如,在以下URL中:
https://www.example.com/search?q=keyword&page=1&limit=10
https://www.example.com
是URL的协议和主机部分。
/search
是URL的路径部分。
q=keyword&page=1&limit=10
是查询参数部分。
在这个例子中,查询参数包含了三个键值对:
q=keyword
表示搜索关键字为 "keyword"。
page=1
表示请求的页码为 1。
limit=10
表示每页显示的结果数量限制为 10。
6.片段标识:
URL解析中的片段标识(Fragment Identifier)是URL中的一个可选部分,用于指定文档或资源中的特定片段或位置。片段标识位于URL的路径和查询参数之后,由井号(#)开头,后面跟着具体的标识符。
片段标识通常用于指示文档中的锚点或内部导航目标。它可以让用户直接跳转到特定部分,而无需滚动整个页面。常见的用法包括跳转到特定章节、段落、标题、注释或特定位置。
片段标识不会被包含在HTTP请求中发送到服务器,而仅在客户端处理和使用。服务器通常不会根据片段标识来处理请求或生成响应
二.发送http请求
服务器通过已建立的连接向服务器发送http请求。请求中包含方法(GET,POST),路径,请求头和其他相关信息。
-
请求行:浏览器构建请求行,包括请求方法、URL和HTTP协议版本。常见的请求方法包括:
-
GET:获取指定资源。
-
POST:向服务器提交数据,用于创建新资源或执行操作。
-
PUT:向服务器上传数据,用于替换指定资源。
-
DELETE:删除指定资源。
-
HEAD:获取资源的头部信息,不包含实际内容。
-
OPTIONS:获取服务器支持的请求方法和功能。
-
-
请求头部:浏览器可以添加多个请求头部,用于提供额外的信息。常见的请求头部包括:
-
User-Agent:浏览器的用户代理信息,用于标识浏览器类型和版本。
-
Content-Type:请求体中的数据类型,常用于POST请求。
-
Accept:浏览器可以接受的响应内容类型。
-
Referer:包含当前请求页面的URL,用于标识请求的来源。
-
Cookie:包含与当前域关联的Cookie数据。
-
Authorization:用于身份验证的凭据。
-
-
请求体:对于某些请求方法(如POST),浏览器可以在请求体中发送数据。请求体可以包含表单数据、JSON数据、文件上传等内容。
三.服务器处理请求
收到http请求的服务器根据请求内容进行处理。
-
接收请求:服务器通过网络接收到客户端发送的HTTP请求消息。这通常是通过网络套接字实现的,服务器监听指定的端口并接收传入的请求。
套接字是一个软件抽象层,它封装了底层网络协议的细节,并提供了一组编程接口,使得应用程序可以通过网络进行数据传输。套接字可以看作是网络中两个程序之间的通信端点,一个套接字用于发送数据,另一个套接字用于接收数据。
当服务器程序监听指定的端口时,它会通过网络套接字绑定该端口号,并开始等待该端口上的传入连接请求。这样,当其他计算机上的客户端程序发起连接请求时,请求会被传送到服务器所监听的端口。
2.解析请求:服务器解析接收到的HTTP请求消息。它会解析请求行、请求头部和请求体,以获取请求的方法、URL、头部信息和请求体内容。
a.接收请求消息:一旦接收到请求消息,服务器将其保存在内存中以进行解析.
b.解析请求行:服务器会将请求行分解为方法、URL和协议版本三个部分,以便后续处理。
c.解析请求头:请求头包含了一系列的键值对,描述了请求的各种属性和要求。服务器会解析并提取请求头中的各个字段,如Host、User-Agent、Content-Type等。
d.解析请求主体:如果请求消息包含请求主体(如POST请求中的表单数据),服务器会根据请求头中的Content-Length或Transfer-Encoding字段来确定请求主体的长度或编码方式,并进行相应的解析。
e.处理请求:服务器可能会根据请求的URL路由到不同的处理程序或执行相应的操作,如返回静态文件、调用后端接口等。
3.路由处理:服务器根据解析得到的URL和请求方法,确定要处理请求的目标资源或执行的操作。这通常涉及到服务器的路由配置,将请求映射到相应的处理程序或控制器。
a.路由配置:服务器会事先进行路由配置,定义了不同URL路径和请求方法的映射关系,以及相应的处理程序或控制器。这个配置通常在服务器的代码或配置文件中进行设置。
b.解析URL.
c.匹配路由规则:服务器将解析得到的URL与路由配置进行匹配,寻找与请求路径和请求方法相匹配的路由规则。路由规则可以是简单的字符串匹配,也可以使用正则表达式或其他灵活的方式进行匹配。
d.路由处理:一旦找到匹配的路由规则,服务器会执行相应的处理程序或控制器。这可能是调用特定的函数、类方法或执行一系列操作,以生成响应或处理请求的业务逻辑。
e.数据传递:路由处理过程中,服务器将请求的相关信息传递给处理程序或控制器。这可能包括URL中的参数、查询参数、请求头、请求主体等数据,以供处理程序使用。
f.执行操作:处理程序或控制器根据具体业务逻辑执行相应的操作。这可能涉及读取数据库、计算数据、调用其他服务或生成响应内容等操作。
四.服务器响应
服务器处理完请求后,会生成一个http响应,其中包含响应头和响应体。响应头包含相应的状态码(如200表示成功,404表示未找到等)和其他相关信息。
-
响应头(Response Headers):响应头包含了关于响应的元数据信息:
以下是一些常见的响应头字段:
a.状态码(Status Code):指示请求处理的结果状态。例如,200表示成功,404表示未找到,500表示服务器内部错误等。状态码提供了客户端了解服务器响应的重要信息
1xx:信息性状态码,表示服务器已接收到请求并且正在处理。
2xx:成功状态码,表示服务器成功处理了请求。
200 OK:请求成功,服务器成功返回所请求的资源。
201 Created:请求成功,服务器创建了新的资源。
204 No Content:请求成功,但服务器没有返回任何内容。
3xx:重定向状态码,表示需要进一步操作以完成请求。
301 Moved Permanently:请求的资源已永久移动到新位置。
302 Found:请求的资源暂时移动到新位置。
304 Not Modified:客户端缓存的资源未修改,可以直接使用缓存。
4xx:客户端错误状态码,表示客户端发送的请求有误。
400 Bad Request:请求无效,服务器无法理解请求。
403 Forbidden:请求被服务器拒绝,权限不足。
404 Not Found:请求的资源不存在。
5xx:服务器错误状态码,表示服务器在处理请求时出现了错误。
500 Internal Server Error:服务器内部错误,无法完成请求。
502 Bad Gateway:服务器作为网关或代理,从上游服务器收到无效的响应。
503 Service Unavailable:服务器暂时无法处理请求,通常是由于过载或维护。
b.内容类型(Content-Type):指示响应体中的数据类型。常见的内容类型包括text/html、application/json、image/jpeg等,以告知客户端如何解析和处理响应体的数据。
c.缓存控制(Cache-Control):指示客户端如何处理响应的缓存。通过设置缓存控制,服务器可以要求客户端缓存响应、重新验证缓存或不缓存响应等。
d.重定向(Location):用于重定向客户端到另一个URL。当服务器需要将请求重定向到其他资源时,会使用该字段指示客户端新的URL地址。
e.响应时间(Date):指示服务器生成响应的时间。这有助于客户端了解响应的时间信息。
f.其他自定义字段:服务器还可以通过自定义的响应头字段传递其他额外的信息,以满足特定需求。
2.响应体(Response Body):响应体包含了服务器返回给客户端的具体数据或资源。响应体的内容根据请求的性质和服务器的处理逻辑而有所不同。例如:
a. 对于HTML请求,响应体可能包含HTML文档,用于渲染页面。
b. 对于JSON请求,响应体可能包含JSON格式的数据,用于提供结构化的数据给客户端应用程序。
c.对于文件下载请求,响应体可能包含文件的二进制数据或文件的URL地址。
d.对于错误响应,响应体可能包含错误信息或错误页面。
五.接收响应
浏览器接收到服务器发送的http响应后,开始解析响应头和响应体。
-
浏览器会解析响应头。响应头包含了服务器对请求的处理结果和相关的元数据信息,如响应状态码、响应时间、内容类型等。
-
浏览器会检查响应状态码。浏览器会根据状态码来判断请求是否成功,并采取相应的操作。例如,如果状态码是200,表示请求成功,浏览器会继续处理响应;如果状态码是404,表示请求的资源不存在,浏览器会显示相应的错误页面。