粗读《网络是怎么连接的》的第一章,讲述了从应用程序,解析URL到委托给操作系统的大致流程
- 解析 URL, 生成 HTTP 消息
- 向 DNS 服务器获取 web server IP
- 全球 DNS 服务器大接力
- 委托协议栈发送消息
其中涉及到很多的概念:URL HTTP DNS Socket 协议栈。
逐一的探索一下。
URL
URL: Uniform Resource Locators(URLs), 通过 Internet 定位和访问资源。
URL 规范源自 World-Wide Web global information initiative(万维网全球信息倡议)
1. URL 的主要组成部分
URL 协议格式:<scheme>:<scheme-specific-part>
scheme:url 方案名称,例如:http ftp
例如:www.w3.org/
方案名称由以下字符组成组成:字母(a~z) 数字 + . - 不分大小写。
2. URL 字符编码问题
使用 US-ASCII
<scheme>://<net_loc>/<path>;<params>?<query>#<fragment>
2.1 保留字符
";" | "/" | "?" | ":" | "@" |
"&" | "=" | "+" | "$" | "," |
2.2 非保留字符
可直接在url中使用
unreserved = alphanum | mark
alphanum = 字母 | 数字
mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
忽略大小写
2.3 URI和非ascii字符
转换公式
URI character sequence->octet sequence->original character sequence
URI 字符序列 -> octet序列(US-ASCII) -> 原始序列
octet: 8bit, 2^8=256
"a" 表示 octet 97 (decimal)
%0a 表示 octet 10 (decimal)
%E4%BD%A0%E5%A5%BD --> 你好
一个字符对应三组一般是 UTF-8
国家标准|GB 18030-2005 (samr.gov.cn)
2.4 URI 中不允许使用的 US-ASCII 字符
不允许使用的字符以及理由
control = <US-ASCII coded characters 00-1F and 7F hexadecimal>
1. 不可打印
2. 会被某些控制机制误解
space = <US-ASCII coded character 20 hexadecimal>
1. 很多上下文中空格用于分隔URI
2. 多一个空格少一个空格不容易被察觉
delims = "<" | ">" | "#" | "%" | "双引号 |
<>" 常在文档中用作 URI 的分隔符
# 在URI中表示 fragment identifier 的分隔符
% 转移字符
unwise = "{" | "}" | "|" | "\" | "^" | "[" | "]" | "`"
gateways 或其他 transport proxy 会修改他们或把他们当分隔符
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