1 应用层协议原理
- 客户端-服务器(C/S)体系架构
- 服务器一直运行,有固定的IP和端口
- 需要服务器场,可扩展性较差
- 客户端主动与服务器通信,不直接与其他客户端连接
- 对等体(P2P)体系架构
- 几乎没有一直运行的服务器
- 任意端到端系统之间可以进行通信
- 每个节点既是客户端又是服务器
- 具有自扩展性
- C/S和P2P混合体
- 用户上线时向中心服务器注册其IP地址
- 用于与中心联系获取好友的IP地址
- 两个用户间聊天使用P2P协议
1.1 进程通信
客户端进程和服务器进程需要通过交换报文(Message)来通信,这里涉及到如下问题
- 进程标识和寻址问题
- IP、端口、传输层协议(TCP、UDP)
- 传输层-应用层提供服务如何(下层提供的服务)
- 要传输的报文;源主机(IP、端口、协议);目标主机(对方IP、端口、协议)
- 传输层实体根据这些信息进行TCP报文段(UDP数据报)的封装
- 完成连接后使用socket代替4元组(源IP、Port,目标IP、Port),使得穿过层间的信息量最少,不必每次都将4元组从应用层传入传输层,socket由操作系统进行管理
- 如何使用传输层提供的服务实现进程间报文交换(本层定义的协议)
- 定义应用层的协议:报文格式,解释,时序等(HTTP、SMTP等)应用层协议根据数据丢失率、吞吐、延迟、安全性等设计。例如TCP更可靠,但UDP无需建立连接速度更快。
- 编制程序,通过API调用网络基础设施提供的服务传输和解析报文
2 HTTP
2.1 HTTP连接
HTTP基于TCP协议。客户端发起与服务器的TCP连接建立套接字;服务器接受TCP连接并建立对应的套接字(服务器多个套接字共享端口号80,客户端发来数据时操作系统根据源IP和端口不同来区分它对应的套接字),接下来客户端和服务器交换HTTP报文传输数据(应用层协议报文),最后TCP连接关闭。HTTP是无状态的,服务器不维护客户端的任何信息。
- 非持久HTTP:最多只有一个对象在TCP连接上发送,下载多个对象需要多个TCP连接(HTTP/1.0)
- 持久HTTP:多个对象可以在一个TCP连接上传输(HTTP/1.1)
2.2 响应时间模型
往返时间RTT(round-trip time):一个小的分组从客户端到服务器再回到客户端的时间(忽略传播时间)
- 非持久HTTP每个对象都需要 2RTT+ 传输时间
2.3 HTTP请求报文
两种类型的HTTP报文:请求、响应
- HTTP请求报文
1 | GET /somedir/page.html HTTP/1.1 // 请求行(GET、POST、HEAD) |
- HTTP相应报文
1 | HTTP/1.1 200 OK\r\n |
2.4 Cookies
cookies可以用于用户验证、推荐、用户状态等维持用户-服务器状态,cookies 4个组成部分
- HTTP响应报文中有一个cookie的首部行
- HTTP请求报文含有一个cookie的首部行
- 客户端中保留一个cookie文件由浏览器管理
- Web站点有一个后台数据库
2.5 Web缓存
目标:不访问原始服务器,就满足客户的请求
用户设置浏览器,通过缓存访问Web,浏览器将所有的HTTP请求发给缓存,如果对象在缓存中则返回对象,不在缓存再访问原始服务器
缓存通常是ISP安装(大学、公司、居民区ISP),可以减少服务器载荷,降低机构内部与Internet接入链路上的流量
解决方案:条件GET方法,HTTP请求报文 If-modified-since: 如果对象是最新的,就不要发送对象,服务器返回 304 Not Modified;如果对象被修改则返回 200 OK
3 FTP
FTP基于TCP协议,客户端是发起传输的一方,完成用户认证后可以与服务器进行文件传输。FTP服务器维护用户的状态信息,是有状态的。
FTP使用21号端口进行控制连接,使用20号端口进行数据连接。而HTTP通过80号端口完成控制连接和数据连接
4 Email
使用TCP协议在客户端和服务器之间发送报文,端口号为25(握手、传输报文、关闭),使用ASCII码文本传输数据(所有报文都必须是7位ASCII编码)
- SMTP:推送到接收方的邮件服务器
- 邮件访问协议:从服务器访问邮件
- POP(Post Office Protocol)邮局访问协议
- IMAP(Internet Mail Access Protocol)网络邮件访问协议,有更多特性,在服务器上处理存储的报文,在服务器中有目录
- HTTP:Hotmail,Yahoo等,方便
- POP3,无状态,不允许在服务器建目录,可以设置下载并删除或下载并保留
5 DNS
- 域名系统(Domain Name System,DNS)的必要性
- IP地址标志主机、路由器但IP地址不好记忆
- 字符串 - IP地址 转换存在必要性
- DNS负责将字符串转换为二进制的网络地址(分布式的数据库维护和相应)
- DNS主要思路
- 分层的、基于域的命名机制
- 若干分布式的数据库完成名字到IP的转换
- 运行在UDP上端口号53的应用服务
- 核心的Internet功能,但是在应用层协议实现(网络边缘处理复杂性)
- DNS还可以解决负载均衡(Load Distribution)的问题
5.1 域名服务器维护资源记录
资源记录(resource records):维护域名-IP地址的映射关系
- RR格式:(domain_name,ttl,type,class,Value)
- domain_name:域名
- TTL:time to live 生存时间(这个缓冲记录的有效时间)
- Class:类别(互联网中这个值记录为Internet的缩写IN)
- Value:值,域名对应的IP地址,也可以是ASCII码
- Type:类别
- Type=A:Name为主机,Value为IP
- Type=CNAME:Name为规范名字的别名,Value为规范名字
- Type=NS:Name域名,Value为该域名的权威服务器的域名(i.cnblogs.com应该能在cnblogs.com中找到自己的地址)
- Type=MX:Value为name对应的邮件服务器的名字
5.2 DNS工作过程
- 应用调用解析器(resolver)
- 解析器作为客户向Name Serer发出查询报文(UDP数据报)
- Name Server返回响应报文(name/ip)
6 P2P
6.1 CS和P2P模式
CS模式:服务器传输给peer节点,服务器必须顺序传输N个文件拷贝,客户端必须下载一个文件拷贝。随着客户端数量增多,下载速度会越来越慢
P2P模式:服务器至少需要上载一份拷贝,客户端必须下载一个文件拷贝,但所有peer节点都可以上载使得最大上载带宽随peer增加
6.2 P2P文件分发:BitTorrent
将文件分为256KB的块,网络中的peers发送和接收文件快,相互服务
- Napster 集中式目录的设计(集中式):上线通知服务器我有的资源,下线删除资源,客户端向服务器目录请求其他资源并与其他节点建立连接
- 服务器故障资源目录就会下线
- 所有人请求目录资源也会有性能问题
- 侵犯版权
- Gnutella 查询泛洪的设计(完全分布式):没有中心服务器,通过图网络进行泛洪查询
- 建立连接:下载软件后有一个常驻节点的表,通过该标向网络泛洪发起上线通知,然后挑选几个返回的节点进行连接加入网络
- 断开连接:告知与自己连接的节点下线
- KaZaA 利用不对称性(组合体):设计其中几个对等体为小组长,小组长之间有TCP连接
- 每个文件有一个散列标识码和描述符
- 客户端向组长发送关键字查询
- 组长匹配元数据、散列标识码、IP地址,向其他组长发起查询,其他组长进行匹配
- 客户端想拥有文件的对等体发送带散列标识码的HTTP请求
7 CDN
内容分发网络(Content Distribution Networks,CDN):通过CDN在全网部署缓存节点,存储服务内容,就近为用户提供服务,用户从CDN请求内容(用户重定向到最近的拷贝来请求内容)
- CDN节点选择
- 用户向原始网站请求数据,原始网站中包含一个视频的链接
- 浏览器解析视频地址,向本地DNS服务器请求地址
- 本地服务器向权威名字服务器请求视频地址,权威名字服务器返回给本地服务器重定向地址
- 本地服务器向重定向地址的DNS服务器请求,返回距离用户最近的视频服务器地址
- 本地DNS服务器返回给用户视频的地址
- 网络拥塞时CDN节点切换
- CDN节点存储内容选择
8 socket
TCP:可靠地、字节流的服务
UDP:不可靠(数据UDP数据包)服务
8.1 TCP socket
- 服务器处于运行状态
- 创建欢迎socket
- 和本地端口绑定
- 在欢迎socket上阻塞式等待接收用户的连接
- 客户端主动和服务器建立连接
- 创建客户端本地套接字(隐式捆绑到本地端口)
- 指定服务器IP和端口,与服务器进程连接
- 客户端连接请求到来时
- 服务器接收来自客户端的请求,接触阻塞式等待
- 返回一个新的socket(该socket绑定服务器守候的IP和端口以及客户端的IP和端口,系统通过收到字节流的IP和端口区分应该发送给哪个socket)
1 | struct sockaddr_in{ |
Linux TCP/UDP socket 通信和IO多路复用
8.2 UDP socket
Linux TCP/UDP socket 通信和IO多路复用(3.2UDP)