第1章 浏览器生成消息
1.1.1 探索之旅从输入网址开始
URL:Uniform Resource Locator,统一资源定位符。
FTP:File Transfer Protocol,文件传送协议。这是一种在上传、下载文件 时使用的协议。使用 FTP 协议来传送文件的程序也被叫作 FTP。
URL 开 头的文字,即“http:”“ftp:”“file:”“mailto:”这部分文字都表示浏览器应当使用的访问方法。
1.1.4 HTTP的基本思路
HTTP1.0 支持 GET POST HEAD (PUT DELETE 非正式规格)
HTTP1.1 支持 GET POST HEAD OPTIONS PUT DELETE TRACE CONNECT
GET 获取URI指定的信
POST 从客户端向服务器发送数据
HEAD 和GET基本相同,但是只返回HTTP的消息头,无内容
OPTIONS 用于通知或查询通信选项
PUT 替换URI指定的文件,不存在则创建
DELETE 删除URI指定的文件
TRACE 将服务器收到的请求行和头部(header)直接返回客户端,用于在代理环境中检查请求改写情况
CONNECT 使用代理传输加密消息时使用的方法
1.1.5 生成 HTTP 请求消息
(a)请求消息
<方法><空格><URI><空格><HTTP> <-请求行
<字段名>:<字段值> <- 消息头
...
...
...
<空行>
<消息体> <- 消息体
(b)响应信息
<HTTP版本><空格><状态码><空格><响应短语> <- 状态行
<字段名>:<字段值> <- 消息头
...
...
...
<空行>
<消息体> <- 消息体
表 1.2 HTTP 中主要的头字段
HTTP1.0 1.1 都支持
Date
Pragma
Authorization
From
Referer
User-Agent
Location
Content-Encoding
Content-Length
Content-Type
Allow
...
HTTP1.0 不支持
Cache-Control
Connection
Transfer-Encoding
Content-Language
Via
...
HTTP1.0草案支持
Accept
Accept-Encoding
Accept-Charset
...
1.1.6 发送请求后会收到响应
状态码的第一位数字表示状态类型,第二、三位数字表示具体的情况。下表列举了 第一位数字的含义。
状态码 含 义
1xx 告知请求的处理进度和情况
2xx 成功
3xx 表示需要进一步操作
4xx 客户端错误
5xx 服务器错误
1.2.1 IP 地址的基本知识
子网掩码为 1 的部分表示网络号,子网掩码为 0 的部分表示主机 号
IP 地址的主机号
全 0:表示整个子网
全 1:表示向子网上所有设备发送包,即“广播”
1.2.2 域名和 IP 地址并用的理由
(
域名(Domain Name),是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位。
)
1.2.3 Socket 库提供查询 IP 地址的功能
DNS:Domain Name System,域名服务系统。将服务器名称和 IP 地址进行 关联是 DNS 最常见的用法,但 DNS 的功能并不仅限于此,它还可以将邮 件地址和邮件服务器进行关联,以及为各种信息关联相应的名称。
来自客户端的查询消息包含以下 3 种信息。
(a) 域名
服务器、邮件服务器(邮件地址中 @ 后面的部分)的名称
(b) Class
在最早设计 DNS 方案时,DNS 在互联网以外的其他网络中的应用 也被考虑到了,而 Class 就是用来识别网络的信息。不过,如今除了 互联网并没有其他的网络了,因此 Class 的值永远是代表互联网的 IN
(c) 记录类型
表示域名对应何种类型的记录。例如,当类型为 A 时,表示域名 对应的是 IP 地址;当类型为 MX 时,表示域名对应的是邮件服务 器。对于不同的记录类型,服务器向客户端返回的信息也会不同
1.3.2 域名的层次结构
在互联网 中,com 和 jp 的上面还有一级域,称为根域。
根域不像 com、jp 那样有自 己的名字,因此在一般书写域名时经常被省略,如果要明确表示根域,应 该像 www.lab.glasscom.com. 这样在域名的最后再加上一个句点。不过,一般都不写最后那个句点,因此根域的存在 往往被忽略,根域的 DNS 服务器中保管着 com、jp 等的 DNS 服务器的信息。
1.3.3 寻找相应的 DNS 服务器并获取 IP 地址
递归查询
1.3.4 通过缓存加快 DNS 服务器的响应
1.4 委托协议栈发送消息
1.4.1 数据收发操作概览
1.4.2 创建套接字阶段
(
gethostbyname函数在执行时可能会阻塞,
且返回struct hostent指针指向一个静态数据,线程不安全。
如果我们使用GNU环境,我们可以使用gethostbyname_r或者gethostbyname2_r来替换掉gethostbyname函数。它们能够良好的解决多线程或多进程安全性问题,并且提供选择地址族参数。
)
1.4.3 连接阶段:把管道接上去
(
DNS同时占用UDP和TCP端口53
UDP报文的最大长度为512字节,而TCP则允许报文长度超过512字节。当DNS查询超过512字节时,协议的TC标志出现删除标志,这时则使用TCP发送。通常传统的UDP报文一般不会大于512字节。
)
1.4.4 通信阶段:传递消息
1.4.5 断开阶段:收发数据结束
后来人们又设计出了能够在 一次连接中收发多个请求和响应的方法。在 HTTP 版本 1.1 中就可以使用 这种方法
问题
1. http://www.nikkeibp.co.jp/ 中的 http 代表什么意思?
客户端端应当使用的访问方法,即协议。
2. 下面两个网址有什么不同?
a. http://www.nikkeibp.co.jp/sample
b. http://www.nikkeibp.co.jp/sample/
a 定位到sample文件,b定位到sample目录,请求的文件取决于服务器的实现,通常为sample目录下的index.html、index.htm等
3. 用来识别连接在互联网上的计算机和服务器的地址叫什么?
IP地址
4. 根据Web服务器的域名来查询IP地址时所使用的服务器叫什么?
DNS(域名服务系统 )服务器
5. 向 DNS 服务器发送请求消息的程序叫什么?
DNS客户端
第 2 章 域名服务系统 ——探索协议栈和网卡
2.1 创建套接字
2.1.1 协议栈的内部结构