1 应用层协议原理

  • 客户端-服务器(C/S)体系架构
    • 服务器一直运行,有固定的IP和端口
    • 需要服务器场,可扩展性较差
    • 客户端主动与服务器通信,不直接与其他客户端连接
  • 对等体(P2P)体系架构
    • 几乎没有一直运行的服务器
    • 任意端到端系统之间可以进行通信
    • 每个节点既是客户端又是服务器
    • 具有自扩展性
  • C/S和P2P混合体
    • 用户上线时向中心服务器注册其IP地址
    • 用于与中心联系获取好友的IP地址
    • 两个用户间聊天使用P2P协议

1.1 进程通信

  客户端进程和服务器进程需要通过交换报文(Message)来通信,这里涉及到如下问题

  1. 进程标识和寻址问题
    • IP、端口、传输层协议(TCP、UDP)
  2. 传输层-应用层提供服务如何(下层提供的服务)
    • 要传输的报文;源主机(IP、端口、协议);目标主机(对方IP、端口、协议)
    • 传输层实体根据这些信息进行TCP报文段(UDP数据报)的封装
    • 完成连接后使用socket代替4元组(源IP、Port,目标IP、Port),使得穿过层间的信息量最少,不必每次都将4元组从应用层传入传输层,socket由操作系统进行管理
  3. 如何使用传输层提供的服务实现进程间报文交换(本层定义的协议)
    • 定义应用层的协议:报文格式,解释,时序等(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
2
3
4
5
6
7
GET /somedir/page.html HTTP/1.1    // 请求行(GET、POST、HEAD)
Host: www.xidian.edu.cn
User-agent: Mozilla/4.0
Conection: close
Accept-language:cn

// 换行回车符表示保温结束(一个额外的换行回车符)
  • HTTP相应报文
1
2
3
4
5
6
7
8
9
10
HTTP/1.1 200 OK\r\n
Connection close\r\n
Date: Thu, 06 Aug 1998 12:00:15 GMT\r\n
Server: Apache/1.3.0 (Unix) \r\n
Last-Modified: Mon, 22 Jun 1998... \r\n
Content-Length: 6821\r\n
Content-Type: text/html\r\n
\r\n
\r\n
data

2.4 Cookies

  cookies可以用于用户验证、推荐、用户状态等维持用户-服务器状态,cookies 4个组成部分

  1. HTTP响应报文中有一个cookie的首部行
  2. HTTP请求报文含有一个cookie的首部行
  3. 客户端中保留一个cookie文件由浏览器管理
  4. 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)

举例某公司访问www.xidian.edu.cn,主机首先查询本地服务器,如果本地服务器缓存没有地址,则首先查询cn找到edu.cn的地址,之后在edu.cn中找到xidian.edu.cn的地址,本地DNS服务器不断根据这些地址去做查询(迭代查询)。本地缓存一般TTL为2天。

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节点选择
    1. 用户向原始网站请求数据,原始网站中包含一个视频的链接
    2. 浏览器解析视频地址,向本地DNS服务器请求地址
    3. 本地服务器向权威名字服务器请求视频地址,权威名字服务器返回给本地服务器重定向地址
    4. 本地服务器向重定向地址的DNS服务器请求,返回距离用户最近的视频服务器地址
    5. 本地DNS服务器返回给用户视频的地址
  • 网络拥塞时CDN节点切换
  • CDN节点存储内容选择

8 socket

TCP:可靠地、字节流的服务

UDP:不可靠(数据UDP数据包)服务

8.1 TCP socket

  • 服务器处于运行状态
    • 创建欢迎socket
    • 和本地端口绑定
    • 在欢迎socket上阻塞式等待接收用户的连接
  • 客户端主动和服务器建立连接
    • 创建客户端本地套接字(隐式捆绑到本地端口)
    • 指定服务器IP和端口,与服务器进程连接
  • 客户端连接请求到来时
    • 服务器接收来自客户端的请求,接触阻塞式等待
    • 返回一个新的socket(该socket绑定服务器守候的IP和端口以及客户端的IP和端口,系统通过收到字节流的IP和端口区分应该发送给哪个socket)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct sockaddr_in{
short sin_family; // AF_INET
u_short sin_port; // port
struct in_addr sin_addr; // IP address, unsigned long
char sin_zero[8]; // align
};
struct hostent{
char *h_name;
char **h_aliases;
int h_addrtype;
int h_length; /*地址长度*/
char **h_addr_list;
#define h_addr h_addr_list[0];
};

Linux TCP/UDP socket 通信和IO多路复用

8.2 UDP socket

Linux TCP/UDP socket 通信和IO多路复用(3.2UDP)