# 1. 应用层协议原理
# 2. Web和HTTP
- HTTP连接
- 非持续连接HTTP
- 在TCP上最多发送一个对象,然后关闭连接。下载多个对象要多次连接
- 持续连接HTTP
- 如果网页上有多个资源在同一个服务器上,可以通过单个TCP连接发送
- Web缓存器
安装Web缓存器可以减少接入互联网链接的利用率,重复请求由缓存器承担。
$$
{delay}_{\text{总}} = \alpha \times {delay}_{\text{缓存器响应}}+(1-\alpha)\times {delay}_{\text{初始服务器响应}} \approx (1-\alpha)\times {delay}_{\text{初始服务器响应}}
$$
> $\alpha$:缓存命中率
# 3. 因特网中的电子邮件
- SMTP协议
用于邮件客户端 $\to$ 邮件服务器,或邮件服务器 $\to$ 邮件服务器发送邮件。
# 4. DNS:因特网的目录服务
- DNS:域名转IP。基于UDP。分布式,逐级向下查询:根DNS -> com DNS -> amazon.com DNS,递归查询,同时缓存
报文资源记录:(name,value,type,ttl(time to live))
# 5. P2P应用
- P2P文件分发
使用P2P方法将$F$比特的文件分发到$N$个客户的用时:
$$
D_{P2P} \ge \max{\{F/u_s, F/d_{min}, NF/(u_s+\sum u_i)\}}
$$
- $F/u_s$:服务器传输,至少发送一个副本,除以服务器最大发送速率
- $NF/(u_s + \sum u_i)$:客户接收的总和(总共必须下载$NF$比特)除以最大发送速率总和
- $F/d_{min}$:单个客户的接收速率,文件大小除以最小客户接收速率
- BitTorrent
- 下载:主机周期性地向每个对等方请求文件块列表,然后请求最稀缺的文件块。
- 分享:主机每10秒评估前4名对等方,以最高速率向其发送;每30秒随机选择另1个对等方发送
# 6. 视频流和内容分发网
- 视频
- 编码
- 空间编码:单帧内像素冗余值只发送一次
- 时间编码:只发送当前帧和上一帧的不同点
- CBR编码速率固定;VBR编码速率随空间、时间编码量变化而变化
- DASH:将视频在服务器上分块,客户端自己决定请求的时间、编码速率和服务器
- 内容分发网(CND):在CDN节点上存储内容副本
# 7. 套接字编程:生成网络应用
- UDP
不连接,可能丢失或顺序错乱
```python
# client
serverName = 'hostIP'
serverPort = 12000
clientSocket = socket(AF_INET, SOCK_DGRAM)
message = raw_input('xxx')
clientSocket.sendto(message.encode(), (serverName, serverPort))
modifiedMessage, serverAaddress = clientSocket.recvfrom(2048)
clientSocket.close()
# server
serverName = 'hostIP'
serverPort = 12000
serverSocket = socket(AF_INET, SOCK_DGRAM)
serverSocket.bind((serverName, serverPort))
while True:
message, clientAddress = serverSocket.recvfrom(2048)
# 处理message -> modifiedMessage
serverSocket.sendto(modifiedMessage.encode(), clientAddress)
serverSocket.close()
```
- TCP
连接,有序交付
```python
# client
serverName = 'hostIP'
serverPort = 12000
clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((serverName, serverPort))
message = raw_input('xxx')
clientSocket.send(message.encode())
modifiedMessage = clientSocket.recv(1024)
clientSocket.close()
# server
serverName = 'hostIP'
serverPort = 12000
serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.bind((serverName, serverPort))
serverSocket.listen(1)
while True:
connectionSocket, addr = serverSocket.accept()
message = connectionSocket.recv(1024).decode()
# 处理message -> modifiedMessage
connectionSocket.send(modifiedMessage.encode())
serverSocket.close()
```