Application Layer
HTTP
HTTP
的全程是超文本文件传输协议,即 HyperText Transfer Protocol
用于传输网页等超文本信息。
一个常见的网页(Webpage)主要由以下的东西组成:
- HTML文件
- JavaScript脚本
- CSS层叠样式表
- JPEG等其它资源文件
而HTTP的主要功能就是向客户机正确提供这些文件
URL
URL是输入在浏览器里面用来访问互联网资源的地址,其格式形如:
1 | http://www.someSchool.edu/someDepartment/picture.gif |
这里面主要包含一下几个部分:
http://
指明协议,可能包含http
、https
等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 | GET /somedir/page.html |
其规约如下:
这里面每个键的含义如下:
method
: 包括GET
、POST
、HEAD
、PUT
和DELETE
其中最常用的是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 | 200 OK |
其形式规约为:
这里面的头的含义如下:
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 | GET /fruit/kiwi.gif |
这个时候如果没有发生更改,server会回复:
1 | 304 Not Modified |
表示没有更改,否则会重发这个资源
SMTP
发邮件的流程如下:
DNS
DNS记录
一个DNS记录是一个四元组,内容是 (Name, Value, Type, TTL)
其中的TTL表示
A
记录:记录的是hostname的IP地址NS
记录:这种记录里面的Name
里面放的是请求的域名,而Value
键里面放的是知道该域名IP地址的DNS
服务器名称,例如(foo.com, dns.foo.com, NS)
CNAME
记录:这里面记录的name
是alias
的别名,例如(foo.com, relay1.bar.foo.com, CNAME)
这里面的relay1.bar.foo.com
是foo.com
的规范名称MX
记录:这里面的value是这个域名下面的邮箱的规范名,例如:(foo.com, mail.bar.foo.com, MX)
TBD
P2P
一个P2P网络的形式如下:
这里面的
peer之间不相互传输
在这种情况下,服务器需要向所有的机子传输数据,记
p2p的结构
- 最开始的时候,只有服务器持有这个文件,那么服务器上载的时间至少需要
- 所有client都接收,至少需要
的时间 - 考虑这个网络中所有终端的上载能力,总共需要上载
大小的数据,而所有终端都上载的时候,总的速率为 所以此时最少的分发时间为
考虑以上三点,那么在p2p网络结构中,分发该文件的耗时为:
而下界是可以取到的