132 lines
3.8 KiB
Markdown
132 lines
3.8 KiB
Markdown
# 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协议
|
||
|
||
<img src="D:\Courseware\Computer_Network\Review\images\STMP.png" alt="STMP" style="zoom: 25%;" />
|
||
|
||
用于邮件客户端 $\to$ 邮件服务器,或邮件服务器 $\to$ 邮件服务器发送邮件。
|
||
|
||
# 4. DNS:因特网的目录服务
|
||
|
||
- DNS:域名转IP。基于UDP。分布式,逐级向下查询:根DNS -> com DNS -> amazon.com DNS,递归查询,同时缓存
|
||
|
||
报文资源记录:(name,value,type,ttl(time to live))
|
||
|
||
# 5. P2P应用
|
||
|
||
- P2P文件分发
|
||
|
||
<img src="D:\Courseware\Computer_Network\Review\images\P2P.png" alt="P2P" style="zoom:25%;" />
|
||
|
||
使用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()
|
||
```
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|