3.8 KiB
3.8 KiB
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. 因特网中的电子邮件
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
不连接,可能丢失或顺序错乱
# 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
连接,有序交付
# 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()