HTTP

HTTP 的全程是超文本文件传输协议,即 HyperText Transfer Protocol 用于传输网页等超文本信息。

一个常见的网页(Webpage)主要由以下的东西组成:

  • HTML文件
  • JavaScript脚本
  • CSS层叠样式表
  • JPEG等其它资源文件

而HTTP的主要功能就是向客户机正确提供这些文件

URL

URL是输入在浏览器里面用来访问互联网资源的地址,其格式形如:

1
http://www.someSchool.edu/someDepartment/picture.gif

这里面主要包含一下几个部分:

  • http:// 指明协议,可能包含 httphttps
  • www.someSchool.edu 被称为hostname即主机名,是指提供该服务的主机名称
  • someDepartment/picture.gif 是路径名(Path name) 描述希望获取的资源的位置

这个URL这里是可以整花活的,例如你可以在桌面创建一个 a.txt 的文件,然后在浏览器中输入 file:///C:/Users/Username/Desktop/a.txt 记得把这里面的username换成你自己的用户名,按下回车就可以在浏览器中查看本地的文件了

解释一下这里为什么 file 后面是三个 / 其实你也可以写成 file://localhost/ 的,只是这里省略了

另外,这里的hostname后面可以跟端口,例如:

1
http://www.ericli.vip:8080/

这个URL的含义就是使用HTTP协议访问主机 www.ericli.vip 的 8080 端口

Non-Persistent and Persistent Connections

HTTP有两种连接方式,一种是 Persistent 另一种是 Non-Persistent 这两种的区别就是 Non-Persistent 的链接每一次传输文件都需要重新建立一个 TCP 链接,需要重新花费 2RTT 的时间来握手,而 Non-persistent 的不会

http报文格式

request

一个http头的形式如下:

1
2
3
4
5
GET /somedir/page.html HTTP/1.1
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: fr

其规约如下:

这里面每个键的含义如下:

  • method: 包括 GETPOSTHEADPUTDELETE 其中最常用的是 GET 用于获取一个网页
  • URL: 这里的 URL 字段就只有路径了,因为hostname后面有专门的字段保存
  • Version: 就是这里的 HTTP/1.1 表示使用的 HTTP 版本号
  • Host: 这个键的位置填的是主机名称
  • Connection: close 这一条表示这个http链接预期是 non-persistent
  • User-agent: Mozilla/5.0 这里表示的是浏览器版本
  • Accept-language: fr表示预期收到的语言版本
    而在这个例子中,因为方法是 GET所以不需要写 Entity body 字段,但是如果方法是 POST 之类的,就需要根据用户的输入填写 Entity body 字段

response

一个http的回文如下:

1
2
3
4
5
6
7
8
HTTP/1.1 200 OK
Connection: close
Date: Tue, 18 Aug 2015 15:44:04 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Tue, 18 Aug 2015 15:11:03 GMT
Content-Length: 6821
Content-Type: text/html 
(data data data data data ...)

其形式规约为:

这里面的头的含义如下:

  • HTTP/1.1 200 OK 表示版本号是 HTTP/1.1 状态码为 200 OK 即这个请求找到了服务器并请求到了正确的内容
  • Connection: close 表示server在发送这条http消息之后就会关闭 注意这里和上面请求的区别
  • Date: Tue, 18 Aug 2015 15:44:04 GMT 注意,这里表示的是 这个http回复被服务器创建并发送的时间
  • Server: Apache/2.2.3 (CentOS) 表示服务器的版本信息
  • Last-Modified: Tue, 18 Aug 2015 15:11:03 GMT 表示这个实体上一次被修改的最后时间
  • Content-Length: 6821 表示内容的长度,单位是 bytes
  • Content-Type: text/html  表示返回实体的类型

这里的状态码有以下的可选情况:

  • 200 OK 成功找到了想要的内容并正确返回
  • 301 Moved Permanently 表示网页的内容被永久移动到了新的地址,此时会返回一个 Location: 字段标识出新的地址
  • 400 Bad Request 表示这个请求没有被正确识别,服务器无法做出响应
  • 404 Not Found 表示这个请求的实体无法找到
  • 505 HTTP Version Not Supported 表示服务器无法支持这个版本的 http 服务

Web caching

这个方法的本意就是,你每次请求一个资源的时候没必要都去网站的服务器上请求,可能在局域网内部做一个缓存系统,那么每次请求一个资源的时候,流程如下:

  • 浏览器先和 cache server 握手建立连接并向 cache server 发送请求
  • Web cache 会先检查本地有没有这个资源的拷贝如果有,就把这个资源直接发回去
  • 如果这个 Web cache 没有该资源,那么就会和原始的服务器建立请求并请求该资源
  • web cache 收到资源的时候,会拷贝一份,留存本地并发送给浏览器

Conditional GET

如果 web cache 在储存了副本之后,原始的资源发生了更改,那么会造成不一致,所以这个时候有一个机制可以询问原始的server有没有发生变化,即 web cache 会发送一条请求:

1
2
3
GET /fruit/kiwi.gif HTTP/1.1
Host: www.exotiquecuisine.com
If-modified-since: Wed, 9 Sep 2015 09:23:24

这个时候如果没有发生更改,server会回复:

1
2
3
4
HTTP/1.1 304 Not Modified
Date: Sat, 10 Oct 2015 15:39:29
Server: Apache/1.3.0 (Unix) 
(empty entity body)

表示没有更改,否则会重发这个资源

SMTP

发邮件的流程如下:

DNS

DNS记录

一个DNS记录是一个四元组,内容是 (Name, Value, Type, TTL) 其中的TTL表示

  • A 记录:记录的是hostname的IP地址
  • NS 记录:这种记录里面的 Name 里面放的是请求的域名,而 Value 键里面放的是知道该域名IP地址的 DNS 服务器名称,例如 (foo.com, dns.foo.com, NS)
  • CNAME 记录:这里面记录的 namealias 的别名,例如 (foo.com, relay1.bar.foo.com, CNAME)这里面的 relay1.bar.foo.comfoo.com 的规范名称
  • MX 记录:这里面的value是这个域名下面的邮箱的规范名,例如: (foo.com, mail.bar.foo.com, MX)
    TBD

P2P

一个P2P网络的形式如下:

这里面的 表示第 台机器的上载速度,而 表示它的下载速度

peer之间不相互传输

在这种情况下,服务器需要向所有的机子传输数据,记 那么可以发现,这个时候传输一个大小为 的文件的时间 为:

p2p的结构

  • 最开始的时候,只有服务器持有这个文件,那么服务器上载的时间至少需要
  • 所有client都接收,至少需要 的时间
  • 考虑这个网络中所有终端的上载能力,总共需要上载 大小的数据,而所有终端都上载的时候,总的速率为 所以此时最少的分发时间为
    考虑以上三点,那么在p2p网络结构中,分发该文件的耗时为:

    而下界是可以取到的