1. 结构体系
1.1. CS结构
- 单个数据
- 数据中心
1.2. P2P
1.2.1. 特性
- 自扩展性
1.2.2. 挑战
- ISP友好(不对等网络)
- 安全性
- 激励用户
2. 进程间通信
2.1. message
2.2. socket
进程通过socket软件接口向网络发送message。socket被称为应用程序编程接口(API)。
2.3. 进程寻址
- 主机地址(IP+端口号)
- 主机中接收进程的标识符
2.4. 运输服务
- 可靠数据传输
- 吞吐量:具有吞吐量需求的应用称为带宽敏感的应用,反之为弹性应用
- 定时:舍弃较长时延
- 安全性:运输协议对发送的数据进行加密
2.5. 传输层相关协议
2.5.1. TCP和UDP
2.5.1.1. TCP
- 面向连接,全双工
- 可靠,无丢失和冗余
- 无论TCP还是UDP都没有提供加密,因而产生了新的层次SSL(Secure Sockets Layer),用SSL加强TCP。
2.5.1.2. UDP
- 不可靠传输
- 无连接
2.6. 应用层协议
- 交换的报文类型
- 各种报文的语法
- 字段的语义
- 进程发送报文的方法,报文响应的规则
2.6.1. WEB和HTTP
HTTP是WEB协议的核心
- 无状态
2.6.1.3. 非持续连接
每次请求前后创建/关闭TCP连接。是一种并行连接,可以提高效率。第一次握手请求发送一小段报文,服务器返回一个状态(HTTP响应头的第一行状态码),然后第三次握手时发送HTTP请求报文,收到后服务器开始返回资源,资源传输完成后,关闭TCP连接。非持续连接必须为每一个请求维护一个新的连接,在客户和服务器中都需要分配TCP缓冲区和保持TCP变量,增加了Web服务器的负担。
2.6.1.4. 持续连接
服务器在发送响应后保持TCP连接打开,相同客户端的后续请求能够通过相同的连接进行传送。如果一段时间一个连接没有被使用则自动关闭。HTTP默认使用带流水线的持续连接。
2.6.1.5. 结构
2.6.1.5.1. 请求报文
GET /someUri HTTP/1.1
Host:www.someHost.com
Connection:close
User-agent:Mozilla/5.0
Accept-language:zh
{
"someParam":"someValue"
}
- 请求行:请求方法,URI,HTTP版本。
- 首部行:可以添加大量请求信息。如指明Host(这样URI可以是相对URI),指定是否持续连接,指明客户端,指明语言等。
- 实体:与首部行以一个空行分割,使用GET方法时没有实体,使用POST方法时使用实体,GET变量加在URI中。
2.6.1.6. 响应报文
和请求报文类似,包括:
- 状态行:HTTP版本,返回值,返回信息(200 OK,301 Moved Permanently等)
- 首部行
- 实体
2.6.1.7. cookie
在客户端记录用户的状态。
- 响应报文中的cookie首部行。(如Cookie:JSESSIONID)
- 用户系统中由浏览器管理的cookie文件。
- 请求报文中的cookie首部行。
- Web站点的后端数据库。(如Session)
2.6.1.8. web缓存
也叫代理服务器,可以使用户的所有访问先指向Web缓存器,若有资源,则直接获取,若无资源,由Web缓存器发起向目标的TCP连接,并在本地存储获取到的资源的副本,并向用户发送这个资源的副本。延伸:CDN(内容分发网络)
- 目的:高效利用局域网。
- 问题:数据同步问题。
2.6.1.8.1. 条件GET
HTTP针对Web缓存器数据同步问题的解决方案,即在用户访问时,Web缓存器发送一段没有实体的GET请求到远端服务器并在请求报文首部行中加入"If-Modified-Since:",其内容是上次从互联网中获取的响应报文首部行中"Last-Modified:"中的value。如果该值小于远端服务器的"Last-Modified"时间,则能获取一个304响应报文。
2.6.2. FTP
用户向远程主机访问,建立一个TCP连接并发送验证(口令/SSL),通过后,开启TCP连接。FTP有两个并行的TCP连接:
- 控制连接:用户标识,口令,改变远程目录,存放,获取口令。
- 数据连接:实际发送一个文件(随文件的发送打开连接关闭连接)。
2.6.3. SMTP
比HTTP历史悠久,SMTP一般不使用中间邮件服务器发送邮件,而是两个邮件服务器直接建立TCP连接。HTTP是一个拉协议,SMTP是一个推协议。SMTP要求报文使用7比特ASCⅡ编码,并把所有报文对象(图片等流媒体)放在一个报文中,而HTTP对于每个报文对象有单独的响应报文。
2.6.3.1. SMTP报文
From:xxx@xxx
To:yyy@yyy
Subject:(可选)标题行
ASCⅡ报文体
2.6.4. 邮件访问协议
SMTP是推协议,不能用于客户端访问邮件,此时需要新的协议。
- POP3:极为简单,三阶段工作:特许,事务处理,更新
- IMAP:将报文与文件夹联系,允许文件组命令
- HTTP:略
2.6.5. DNS
主机名转为IP地址的服务。通常由其他应用协议所使用。
客户端->主机名->DNS服务器->ip地址->客户端->发起TCP连接。
2.6.5.1. DNS层次
- 根DNS服务器
- 顶级域DNS服务器
- 权威DNS服务器
- 本地DNS服务器
2.6.5.2. DNS缓存
各级DNS服务器在查询后存储查询到的信息。
2.6.5.3. DNS资源记录RR
(Name,Value,Type,TTL)
Type:A,NS,CNAME,MX
2.6.5.4. DNS报文
2.6.5.5. DNS插入数据
2.6.6. P2P
2.6.6.1. 文件分发
2.6.6.1.1. BitTorrent
- 对等方
- 洪流
- 块
- P2P直播,下载
2.6.6.2. 分布式散列表
- key:文件(副本)
- value:对等方
2.6.6.2.1. 环形DHT
2.7. UDP/TCP套接字编程
2.7.1. UDP
2.7.1.3. DatagramSocket
- DatagramSocket():用于客户端初始化。
- DatagramSocket(int portNumber):用于服务端初始化。
- send(DatagramPacket sendPacket):用于发送内容。
- receive(DatagramPacket receivePacket):用于接收内容。
2.7.1.4. DatagramPacket
- DatagramPacket(byte[] context,long length,InetAddress hostName,int portNumber):通常用于send。
- DatagramPacket(byte[] context,long length):通常用于receive。
2.7.2. TCP
2.7.2.1. ServerSocket
- ServerSocket(int portNumber):服务端初始化。
- accept():获取和Server连接的下一个Socket对象。
- close():关闭服务器。
2.7.2.2. Socket
- Socket(String host,int post):新建一个连接向服务端的Socket。
- getInputStream():获取Socket的输入流,用于读取。
- getOutputStream():获取Socket的输出流,用于写入。
- close():关闭服务器。