粗读《网络是怎么连接的》的第一章,讲述了从应用程序,解析URL到委托给操作系统的大致流程

  1. 解析 URL, 生成 HTTP 消息
  2. 向 DNS 服务器获取 web server IP
  3. 全球 DNS 服务器大接力
  4. 委托协议栈发送消息

其中涉及到很多的概念:URL HTTP DNS Socket 协议栈。

URL

URL: Uniform Resource Locators(URLs), 通过 Internet 定位和访问资源。

URL 规范源自 World-Wide Web global information initiative(万维网全球信息倡议)

URL 是 URI 的子集,遵循 URI 的语法规范。
URI 至今还是由 US-ASCII 的一个子集组成,可以粗略的分成 保留,未保留,转义字符这几类

1. URI 的主要组成部分

使用 US-ASCII

 foo://example.com:8042/over/there?name=ferret#nose
 \_/   \______________/\_________/ \_________/ \__/
  |           |            |            |        |
scheme     authority       path        query   fragment
  |   _____________________|__
 / \ /                        \
 urn:example:animal:ferret:nose

scheme:url 方案名称,例如:http ftp
例如:https://www.w3.org/

方案名称由以下字符组成组成:字母(a~z) 数字 + . - 不分大小写。

2. URI 的语法规范

本文见 https://www.rfc-editor.org/rf... 发表于2005年
2002 年出版的HTTP权威指南参考的应该是 发表于1998年的 https://www.rfc-editor.org/rf...

2.1 保留字符 -- 类似于 java 关键字

reserved    = gen-delims / sub-delims
gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
                / "*" / "+" / "," / ";" / "="

gen-delims 用于分隔 URI组件 的分隔符
sub-delims 组件内部的分隔符

2.2 非保留字符

可直接在url中使用

unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"
忽略大小写

2.3 转义字符

使用 java.net.URLEncoder 试一下

System.out.println(URLEncoder.encode("1aA-._~:/?#[]@!$&'()*+,;=", "UTF-8"));
1aA-._%7E%3A%2F%3F%23%5B%5D%40%21%24%26%27%28%29*%2B%2C%3B%3D

ALPHA / DIGIT / "-" / "." / "_" 以外的字符都需要进行转义

转换公式
URI character sequence->octet sequence->original character sequence
URI 字符序列 -> octet序列(US-ASCII) -> 原始序列
%E4%BD%A0%E5%A5%BD --> e4 bd a0 e5 a5 bd  --> 你好
octet: 8bit, 2^8=256, 两个十六进制相乘, 在URL 中表现为 %HEXHEX

早先时候 Byte 不一定代表 8bit, rfc协议中使用octet表示8bit更为精准

"a" 表示 octet 97 (decimal)
%0a 表示 octet 10 (decimal)

一个字符对应三组(octet)一般是 UTF-8

image.png

Unicode/UTF-8-character table

国家标准|GB 18030-2005 (samr.gov.cn)

90441f9082d3c998fed8e175a5183308.jpeg

3. 具体方案(scheme)

使用BNF语法定义

ftp                     File Transfer protocol
http                    Hypertext Transfer Protocol
file                    Host-specific file names
telnet                  Reference to interactive sessions
...

3.1 通用Internet方案语法

//<user>:<password>@<host>:<port>/<url-path>

3.2 HTTP

http://<user>:<password>@<host>:<port>/<path>?<searchpart>
user password 可选
默认端口:80
path 可选
searchpart 可选

3.3 ftp

默认端口:21
ftp://<user>:<password>@<host>:<port>/<cwd1>/<cwd2>/.../<cwdN>/<name>;type=<typecode>
3.3.1. FTP url-path

url-path 可忽略

格式:
<cwd1>/<cwd2>/.../<cwdN>/<name>;type=<typecode>
typecode:枚举值 a i d

参考

  1. rfc官网
  2. Uniform Resource Locators (URL rfc 1738)
  3. Uniform Resource Locators (URL rfc 2396)
  4. https://www.rfc-editor.org/rf...
  5. Uniform Resource Locators (URL w3.org)

wzyAcyy
9 声望2 粉丝