3.8 KiB
Raw Blame History

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递归查询同时缓存

    报文资源记录namevaluetypettl(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

    不连接,可能丢失或顺序错乱

    # 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()