计算机网络自顶向下方法笔记01

article/2025/10/10 11:35:44

        《计算机网络自顶向下方法》学习笔记。之前学习过计算机网络微课,已经对计网中的很多概念都有了印象和一定的了解了,这时候再读自顶向下感觉比较轻松了。这本书没有涉及太多物理层的内容,第一章为概述。从第二章应用层开始,自顶向下讲解计算机网络。以下是阅读笔记。(github同步更新)

第二章 应用层

        本章的内容主要是网络应用的相关原理,网络应用的实例(Web,电子邮件,DNS,视频流),以及简单的网络应用开发(主要学习套接字接口)。

1.应用层协议原理

1.1 应用程序体系结构

  • 客户服务器体系结构

  • 对等体系结构(P2P)

        客户-服务器体系结构中,服务器服务来自许多其他客户主机的请求、客户之间不进行通信。服务器通常有确定的地址(IP地址),客户通过IP地址向服务器请求服务。为了能够处理请求,通常有配备大量主机的数据中心作为虚拟服务器,而不是单独的服务器主机进行服务。

        P2P体系结构下,主机之间相互通信,他们被称为对等方。许多流量密集型应用都是P2P体系结构。P2P体系的特性是其具有自扩展性,每个对等方由于请求产生工作负载,同时也分发文件为系统增加服务能力。P2P体系结构不需要庞大的服务器基础设施和带宽,但由于高度非集中式结构,有安全性、性能、可靠性方面的挑战。

1.2 数据通信

        两个不同端系统上的进程,通过报文来通信。网络应用程序由成对的进程组成,他们通过网络相互发送报文。两个进程常被标识为客户与服务器。发起通信的进程被标识为客户,在会话开始时等待联系的进程是服务器。

        进程是通过称为套接字的软件接口来发送和接收报文的。套接字是应用程序和网络之间的应用程序编程接口。对于套接字,后续有详细的讨论。

两进程间通信,发送分组的进程需要知道接收分组的进程地址。地址由两部分构成:主机地址;主机中接收进程的标识符。这两部分由IP地址和目的地端口号来标识。

1.3 可供应用程序使用的运输服务

        运输层为应用层提供服务,应用程序服务的要求有以下四个方面:

  • 可靠数据传输

  • 吞吐量

  • 定时

  • 安全性

1.4 因特网提供的运输服务

  • TCP服务

    • 面向连接

    • 可靠数据传输

    • 安全性:安全套接字层(SSL)加强了TCP,提供安全服务

  • UDP服务:仅提供最小服务,无连接,不保证报文到达接收进程。

        定时和吞吐量是因特网运输协议不能保证的,但通常因特网是可以为时间敏感应用提供满意的服务的。

2.Web和HTTP

2.1 HTTP概况

        Web的应用层协议是超文本传输协议HTTP,客户程序和服务器程序中通过HTTP报文进行会话。

  • Web页面由对象组成,一个对象是一个文件。

  • Web浏览器实现了HTTP的客户端,Web服务器是HTTP的服务器端。

  • HTTP是一个无状态协议:服务器不保存关于客户的任何信息。

2.2 非持续连接和持续连接

  • 每个请求相应对是经一个单独的TCP连接发送,则为非持续连接(HTTP1.0)。

  • 所有的请求及响应经相同的TCP连接发送,则为持续连接(HTTP1.1)。HTTP在默认方式下使用带流水线的持续连接,允许请求连续发出,而不需要等待未决请求的回答。

2.3 HTTP报文格式

HTTP请求报文

GET /somdir/page.html HTTP/1.1			
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: fr

        请求报文的第一行为请求行,包含方法字段,URL字段和HTTP版本字段,后继的行为首部行,包含了主机地址及连接方式等信息。在首部行后还有一个实体体,用于POST方法。共有5种方法:GET,POST,HEAD,PUT,DELETE。其中最常用的是GET方法,包括提交表单时也可以使用GET方法。

HTTP响应报文

HTTP/1.1 200 OK
Connection: close
Date: Tue, 18 Gug 2015 15:44:04 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Tue, 18 Gug 2015 15:11:03 GMT
Content-Length: 6821
Content-Type: text/html
(data data ......)

        响应报文包含三个部分:初始状态行,首部行,实体体。其中初始状态行包含了协议版本,状态码和相应状态信息。以下是常见的状态码:

  • 200 OK

  • 301 Moved Permanently

  • 400 Bad Request

  • 404 Not Found

  • 505 HTTP Version Not Supported

2.4 cookie

        HTTP是一个无状态协议,服务器不保存用户的信息。使用cookie可以让服务器标识一个客户,提供服务。cookie有以下4个组件:

  • 响应报文中的一个cookie首部行

  • 请求报文中的一个cookie首部行

  • 用户端系统中保留一个cookie文件,由浏览器管理

  • 位于Web站点的一个数据库,记录用户信息

2.5 Web缓存

        Web缓存器也叫代理服务器,能够代表初始Web服务器满足HTTP请求。Web缓存器可以在存储器空间中保留最近请求过的对象的副本。使用Web缓存器可以大大减少对客户请求的响应时间,还能够大大减少一个机构的接入链路到因特网的通信量。Web缓存器通常由ISP购买和安装。

        Web缓存器带来的一个问题是存放在缓存器中的副本可能不是最新的,因此需要有方式去证实请求的对象是最新的。解决这个问题的方式是使用条件GET方法,在首部行中添加"If-Modified-Since",这样只在指定日期后对象被修改过,才发送该对象。

3.因特网中的电子邮件

        因特网邮件系统有三个主要组成部分:用户代理,邮件服务器,简单邮件传输协议(SMTP)。

        发送邮件的过程如下: 用户代理------>邮件服务器-----SMTP----->邮件服务器----->用户代理

  • 用户代理允许用户阅读、回复、转发、保存和撰写报文。

  • 邮件服务器负责发送和接收邮件,服务器上有一个邮箱,管理和维护着接收到的报文。

  • SMTP是电子邮件使用的应用层协议,使用该协议从发送方的邮件服务器向接收方的邮件服务器发送邮件。

    • SMTP一般不使用中间邮件服务器发送邮件,而是两个服务器之间发送。

    • SMTP限制报文体只能采用简单的7bitASCII表示。

    • SMTP使用持续的TCP连接发送报文。

  • SMTP与HTTP的对比

    • HTTP是一个拉协议,SMTP是一个推协议。

    • SMTP要求每个报文采用7bitASCII码格式

    • HTTP将每个对象封装到自己的HTTP响应报文中,而SMTP把所有报文对象放在一个报文之中。

        SMTP是一个推协议,由发送邮件的服务器将文件发给接收邮件的服务器,接收邮件的用户是不能使用该协议获取接收到的邮件的。获取接收到的邮件使用的是邮件访问协议。流行的邮件访问协议有:第三版的邮局协议POP3;因特网邮件访问协议IMAP;HTTP。

POP3

        POP3协议简单,但功能有限。用户代理打开与邮件服务器的TCP连接后,POP3开始工作。POP3工作有三个阶段:

  • 特许:用户代理发送用户名和口令以鉴别用户。

  • 事务处理:用户代理取回报文,对报文进行删除标记,取消删除标记,获取邮件的统计信息。获取报文有以下两种方式:

    • 下载并保留

    • 下载并删除

  • 更新:结束POP3会话,删除被标记为删除的报文。

IMAP

        使用POP3协议只能获取报文,不能在服务器上创建文件夹对报文进行管理。为了解决这个或一些其他问题,产生了IMAP协议。IMAP服务器把每个报文与一个文件夹联系起来,报文到达时与INBOX文件夹相关联,而收件人能够把邮件移到一个新的文件夹中,阅读,删除或是移动到别的文件夹。IMAP还提供了查询邮件的命令,且IMAP维护了IMAP会话的用户状态信息(文件夹的名字等)。另外,IMAP还允许用户代理获取报文某些部分的命令。这样当用户处于低带宽连接时,可以选择性的只取回(MIME)报文的一部分。

基于Web的电子邮件

        今天,基于Web的邮件已经非常常见了。这种电子邮件,用户代理就是浏览器,用户和远程邮箱之间的通信通过HTTP进行。用户发送和获取电子邮件时,都通过HTTP协议在浏览器和邮件服务器之间进行报文传输,但是邮件服务器之间发送和接收报文仍然使用SMTP。

4.DNS:因特网的目录服务

4.1 DNS概述与DNS服务

        因特网上的主机可以使用多种方式标识。一种易于记忆的方式是主机名,而路由器所需要的标识则是更为具体的IP地址。将主机名转换到IP地址,就是域名系统DNS的任务。

  • DNS是由分层的DNS服务器实现的分布式数据库。

  • DNS是使主机能够查询分布式数据库的应用层协议。

  • DNS协议运行在UDP上,使用53端口。

        除了进行主机名到IP地址的转换,DNS还提供了以下服务:

  • 主机别名:一个主机除了规范主机名外,还可以有其他别名。通过DNS可以获取别名对应的规范主机名和IP地址。

  • 邮件服务器别名:和主机别名相同,邮件服务器也可以使用别名,通过DNS获取规范主机名和IP地址。

  • 负载分配:一个站点可能会被冗余分布在多台服务器上,有不同的IP地址。这些IP地址构成了一个IP地址集,DNS服务器可以在返回这些IP地址时循环改变次序,客户通常选择先返回的IP地址请求服务,这样通过更改返回IP地址的顺序,就能起到负载分配的作用。

4.2 DNS工作原理

        使用单个DNS服务器有单点故障、通信容量,远距离集中(高时延),维护等问题,因此DNS采用了分布式的设计方案。按照层次,DNS服务器分为三种:根DNS服务器;顶级域服务器;权威DNS服务器。除了以上三个层次外,还有一类重要的DNS服务器是本地DNS服务器。本地DNS服务器一般离主机很近,起到代理的作用。在进行DNS查询时,有两种查询方式:递归查询和迭代查询。通常,请求主机到本地DNS服务器的查询是递归的,其余的查询是迭代的。

        为了改善时延性能和减少报文传输,DNS还广泛使用了缓存技术。DNS服务器会缓存主机名/IP地址对,一段时间后才丢弃缓存信息。

5.P2P文件分发

        使用P2P体系结构的网络应用对总是打开的基础设施服务器有最小的依赖。P2P体系结构具有内在自扩展性,无论有多少对等方,P2P体系结构的应用的文件分发时间都小于客户-服务器体系结构的应用。BitToreent是一种用于文件分发的流行P2P协议,以下是BitTorrent的部分功能原理。

        在BitTorrent协议中,参与一个文件分发的所有对等方的集合称为一个洪流。洪流中的对等方互相下载等长度的文件块(典型长度256KB)。对等方刚进入洪流时没有块,一段时间后就持有了块,并可为其他对等方上载块。每个洪流有一个追踪器,当对等方加入洪流时,将向追踪器注册自己,并周期性通知追踪器自己仍在洪流中。

        当一个对等方A加入洪流后,追踪器会给出一个对等方子集及这些对等方的IP地址,A可以从中选择临近的对等方建立TCP连接,交换块列表。选择向邻居请求哪些块使用的策略是最稀缺优先,首先请求邻居中副本最少的块,从而加快这些块的分发。而响应邻居的哪些请求则使用的是一种对换算法,优先响应前四个给A提供数据最高速率的邻居(他们被称为疏通),并且还会每30s随机选择一个对等方B,如果B的速率够高,就把B换进前四位列表。这样对等方能够趋向于找到彼此的协调的速率上载。除了这五个对等方外,其他相邻的对等方不会收到A的块。这种激励机制被称为“一报还一报”。

6.视频流和内容分发网

6.1 视频流

        视频是一系列的图像,可以被压缩,通常用比特率来衡量质量。视频可以被压缩到不同的比特率,让用户根据网络带宽来选择观看的版本。对流式视频最重要的性能度量是平均端到端吞吐量,流式视频应用得到的平均吞吐量至少与压缩视频的比特率一样大。

        在HTTP流中,视频只是一个普通的文件。用户请求视频文件,将收到的字节进行缓存,一旦超过了预先设定的门限就开始播放,将字节处理成帧,并将这些帧解压缩展现在视频上。视频编码为不同比特率的版本经HTTP传输,被称为经HTTP的动态适应流(DASH)。使用DASH后,视频有不同版本存放在服务器中,服务器会有一个告示文件,提供每个版本的URL和比特率信息。客户可以根据可用带宽指定URL和一个字节范围,对视频数据块请求。

6.2 内容分发网

        因特网视频公式每天都需要向百万计的用户发送数据,如果在数据中心存储所有视频,会产生很大的问题。主要有三个问题:1.如果用户离数据中心太远,很可能产生停滞时延。2.流行的视频可能经相同链路发送多次,浪费带宽。3.单个数据中心出现单点故障,就不能分发视频流了。为了解决分发视频数据的问题,,几乎所有的视频流公司都使用内容分发网CDN。CDN管理分布在多个位置的服务器,将用户请求定位到能提供最好服务的CDN位置。CDN包括专用CDN(内容提供商自己的)第三方CDN(代表多个内容提供商分发内容)

        CDN通常集群部署。每个集群只保留一些视频,当用户请求视频时,如果集群中没有该视频,再从其他集群或中心仓库拉取视频到集群,并在本地存储一个副本。CDN的部署通常采用两种原则:

  • 深入:在全球接入ISP中部署服务器集群,靠近端用户。

  • 邀请做客:在少量关键的位置建造大集群,邀请ISP做客。

        使用CDN,用户的请求需要被重定向到CDN服务器,这通常是由DNS进行截获和重定向的。DNS检测到URL中有video以及内容提供商的名字,就返回一个CDN域的主机名,用户将再次发送请求到这个CDN域的DNS系统,并得到CDN节点的IP地址。CDN的集群选择策略是CDN部署的核心,一种简单的策略是指派用户到地理上最为临近的集群,也有周期性实时测量集群和用户到集群时延和丢包性能来选择集群的策略。

7.套接字编程

        网络应用程序有两类,一种使用协议标准(如RFC)定义的操作实现的,另一种是使用专用的应用层协议。如果是开发专用的网络应用程序,应该避免使用熟知端口号。另外一个实现网络应用程序的问题是,该选择TCP还是UDP。这两种协议有各自的特点。以下是分别使用UDP和TCP实现的简单客户-服务器程序(Python实现)。

7.1 UDP套接字编程

# Client
from socket import *def main():serverName = '127.0.0.1'										#本机IPserverPort = 12000												#端口clientSocket = socket(AF_INET, SOCK_DGRAM)						#IPV4,UDPmessage = input("Input lowercase sentence:")clientSocket.sendto(message.encode(), (serverName,serverPort))modifiedMessage,serverAddress = clientSocket.recvfrom(2048)print(modifiedMessage.decode())clientSocket.close()returnif __name__ == "__main__":main()# Server
from socket import *def main():serverPort = 12000serverSocket = socket(AF_INET,SOCK_DGRAM)serverSocket.bind(('',serverPort))message,clientAddress = serverSocket.recvfrom(2048)modifiedMessage = message.decode().upper()serverSocket.sendto(modifiedMessage.encode(),clientAddress)if __name__ == '__main__':main()

7.2 TCP套接字编程

# Client
from socket import *def main():serverName = '127.0.0.1'	serverPort = 12000clientSocket = socket(AF_INET,SOCK_STREAM)						#IPv4,TCPclientSocket.connect((serverName,serverPort))					#建立连接sentence = input("Input lowercase sentence:")clientSocket.send(sentence.encode())							#已建立连接,不需要地址了modifiedSentence = clientSocket.recv(2048)print("From Server:",modifiedSentence.decode())clientSocket.close()if __name__ == '__main__':main()
# Server
from socket import *def main():serverPort = 12000serverSocket = socket(AF_INET,SOCK_STREAM)serverSocket.bind(('',serverPort))serverSocket.listen(1)											#欢迎套接字,等待建立连接print("The server is ready to receive")while(1):connectionSocket,addr = serverSocket.accept()				#客户专用套接字sentence = connectionSocket.recv(2048).decode()modifiedSentence = sentence.upper()connectionSocket.send(modifiedSentence.encode())connectionSocket.close()if __name__ == "__main__":main()

http://chatgpt.dhexx.cn/article/79ZmhYyB.shtml

相关文章

《计算机网络--自顶向下方法》第一章--计算机网络和英特网

1.1什么是英特网 1.1.1具体构成描述 主机(host)或端系统(end system):所有与因特网相连的计算设备 路由器(router):从一条入通信链路接收到达的分组,并通过一条出通信链…

计算机网络(自顶向下方法)-网络层

计算机网络(自顶向下方法)-网络层 4. 1 导论数据平面控制平面 4.2 路由器组成4.3 IP: Internet Protocol数据报格式分片IPv4地址子网IP 地址分类子网掩码(subnet mask)如何获得一个IP地址DHCP: Dynamic Host Configuration Protocol NAT:网络…

计算机网络(自顶向下)笔记

本书是自顶向下进行的, 在第一章概述计算机网络的层次结构,从第二章开始从上到下一章介绍一层(大致), 最后是移动互联网/网络安全的内容 计算机网络中的每一层都具有一定的功能, 通过层间接口向上层提供服务, 通过调用下层接口实现一定的功能. 每一层的学习方式 原理 功能向…

【计算机网络:自顶向下方法】(一)计算机网络和英特网

文章目录 1.1什么是Internet?概念internet 结构网络结构 1.2网络边缘1.3网络核心: 数据交换的功能电路交换分组交换分组交换: 排队延迟和丢失网络核心的关键功能电路交换和分组交换的比较电路交换分组交换 分类 1.4 接入网和物理媒体住宅接入 : modem接…

计算机网络重点知识整理(自顶向下)

前言 忙碌的学期结束了,趁自己对知识点的掌握还没有忘记,对计算机网络的知识点做一个整理,整理的侧重点在本校老师重点讲述部分,大家参考即可。 整理的资源来自教材(计算机网络自顶向下)以及PPT。 内容有误…

计算机网络(自顶向下方法)-Internet概述

计算机网络(自顶向下方法)-Internet概述 1.概论1.1 什么是Internet?从具体构成角度终端设备 什么是协议? 1.2 网络边缘1.3 网络核心电路交换分组交换数据报(datagram) 的工作原理虚电路(virtual circuit)的工作原理网络分类 1.4 接入网和物理…

计算机网络-自顶向下(学习笔记)

1. 计算机网络与互联网 1.1 什么是互联网 终端系统通过通信连接(communication links)和包交换机(packet switches)连接在一起 包交换机的两种主要类型 路由器(routers)与链路层交换机(link-layer swtiches)路由器应用于网络核心,链路层交换机用于接入层transmiss…

计算机网络自顶向下-应用层

一、简介: 网络应用是计算机网络存在的理由,没有了应用也不存在任何的网络协议。我们学习网络应用的原理和实现方面知识,从定义应用层概念开始,其中包括网络服务、客户】服务器、进程和运输层接口。 其中包括我们熟悉的web、emai…

《计算机网络 自顶向下方法》学习整理

《计算机网络 自顶向下方法》学习整理 计算机网络1、计算机网络(1)英特网(2)网络边缘(3)网络核心(4)时延、丢包、吞吐量(5)协议层次 2、应用层(1&…

计算机网络复习(自顶向下)知识点总结(一天一夜超8000字,详细知识点总结,带重点标注目录)

计算机网络复习(自顶向下)1~2章 复习目录一、计算机网络基本概念1.1 认识英特网1.2 网络边缘1.3 网络核心1.4 ⭐时延、丢包和吞吐量1.5 协议层次和服务模型1.6 安全和历史(略) 二、应用层2.1 应用层协议原理2.2 ⭐Web和HTTP协议2.…

游戏引擎之物理碰撞检测原理(AABB算法)

在游戏或者仿真虚拟环境中需要模拟现实中的物理碰撞,由于模型边缘复杂,在精确度不高的游戏中经常把它处理为正方体盒子,然后再检测物理碰撞,常用的算法为AABB碰撞盒算法 先遍历模型所有顶点遍历所有顶点,然后再不同方…

不使用物理系统判断两个矩形是否碰撞

如图所示,不使用物理系统去检测两个物体是否碰撞的效果。 注意:两个物体如果一直相交,在Update中处理的时候会一直输出,在实际使用时需要注意相交时的处理。 直接上代码: 检测碰撞使用的是两个节点,节点有…

游戏物理中的碰撞测试(一) - 如何检测碰撞

日期:2008年10月 介绍 在文章中我会介绍3D撞击测试的原理和一些基本的实现步骤,当然也会写一些我在实现上的心得。所有的例子我都是在Visual C Express 2008里编译,还需要下载最新版本的OpenGL类库。我想提一下,这并不是一个新的课…

UE4 物理碰撞(C++)

设置碰撞 // 组件 ->SetCollisionEnabled(ECollisionEnabled::NoCollision); 注释:没有碰撞 // 组件 ->SetCollisionEnabled(ECollisionEnabled::PhysicsOnly); 注释:只有物理 // 组件 ->SetCollisionEnabled(ECollisionEnabled::Quer…

cocos creator 3.x 2d物理碰撞检测(不使用物理刚体)

cocos creator 3.x 2d物理碰撞检测(不使用物理刚体) 前言 我含着热泪而来,因为获取不到2d物体的碰撞检测弄了半天。之前一直学2.x,后面学了3.x版本,发现对于新手来说,蛮多需要去适应的,最主要…

BEPU物理引擎碰撞系统的架构与设计

前面我们讲解了如何监听物理引擎的碰撞事件, 在物理引擎内核中如何架构与设计碰撞规则,使得物理Entity与周围的物理环境产生碰撞时,如何灵活的控制物理碰撞,本节給大家详细的讲解BEPUphysicsint 物理引擎内部是如何管理与控制碰撞规则的。本文主要讲解3个…

11. unity 物理系统和碰撞检测+射击游戏案例

1. 物理系统 也就是在游戏场景中添加日常的重力,碰撞等到物理属性 1.1 刚体组件(Rigidbody) 给模型添加刚体组件后,模型会具备一些物理属性,比如重力,速度,加速度等,在属性窗口中点击Add Component,选择Physics->Rigidbody,如下图所示:添加刚体组件后,运行游…

Cocos Creator 如何处理物理和碰撞检测?

Cocos Creator 如何处理物理和碰撞检测? cocos creator 版本:v3.6.1 Cocos Creator 3.x 实现碰撞检测 Cocos Creator 通过使用物理引擎来处理物理和碰撞检测。Cocos Creator 默认使用 Box2D 物理引擎,也支持使用 Chipmunk 物理引擎。以下是处理物理和碰撞…

【唐老狮】Unity——物理系统(碰撞检测)

【学习目标】 碰撞检测 能够让两个游戏物体之间产生碰撞 能够让两个物体碰撞时表现出不同效果 能够通过代码检测到碰撞产生的不同阶段 能够使用触发器让两个物体相互穿透 能够通过代码检测到触发产生的不同阶段 【碰撞检测】 【碰撞的必要条件】 两个游戏物体&#xff…

unity物理碰撞操作方案

经unity官方网站资料改写整理书写本博客,原网址方案链接如下: Lesson 2.4 - Collision Decisions - Unity Learn 首先 1.先创建两个物体 然后 2.给这两个物体加上Box Collider 组件,并勾选“是触发器”(英文:is 啥…