# 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协议 STMP 用于邮件客户端 $\to$ 邮件服务器,或邮件服务器 $\to$ 邮件服务器发送邮件。 # 4. DNS:因特网的目录服务 - DNS:域名转IP。基于UDP。分布式,逐级向下查询:根DNS -> com DNS -> amazon.com DNS,递归查询,同时缓存 报文资源记录:(name,value,type,ttl(time to live)) # 5. P2P应用 - 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() ```