当前位置: 首页 > news >正文

做元器件上什么网站h5case是什么网站

做元器件上什么网站,h5case是什么网站,郑州二七区网站建设,撰写网站建设技术解决方案应用层 应用层协议原理 网络应用的体系结构 客户-服务器#xff08;C/S#xff09;体系结构 对等体#xff08;P2P#xff09;体系结构 C/S和P2P体系结构的混合体 客户-服务器#xff08;C/S#xff09;体系结构 服务器 服务器是一台一直运行的主机#xff0c;需…应用层 应用层协议原理 网络应用的体系结构 客户-服务器C/S体系结构 对等体P2P体系结构 C/S和P2P体系结构的混合体 客户-服务器C/S体系结构 服务器 服务器是一台一直运行的主机需要较高的可靠性。服务器有一个固定IP地址和一个周知的端口号以便客户端可以找到并连接到它。扩展性服务器场/数据中心。为了处理大量的并发请求服务器可能部署在服务器场或数据中心内为其提供必要的硬件带宽和电力资源。但是尽管服务器可以通过增加更多硬件资源来扩展但这种扩展性是有限的。当服务器处理能力达到一定的阈值后性能可能会急剧下降这通常是因为硬件资源的限制、软件的并发处理能力限制或网络带宽的瓶颈。 客户端 主动通信客户端软件主动向服务器发起请求并与之通信。客户端发出请求后服务器响应这些请求并提供所需的服务或数据。间歇性连接客户端可能并不总是在线。例如一台个人电脑可能只在用户需要时连接到互联网。动态IP地址客户端通常不需要固定IP地址特别是家庭用户和移动用户它们可能从互联网服务提供商获得动态分配的IP地址。与其他客户端的通信在纯粹的C/S模型中客户端一般不会直接与其他客户端通信所有的交互都是通过服务器进行中转。 对等体P2P体系结构 P2P模式区别于传统的C/S模式在P2P模式中每个结点或对等体既可以作为客户端也可以作为服务端。 P2P体系的主要特征 分布式服务P2P网络中没有一直运行的中心服务器。相反每个节点都提供一部分网络所需的服务。对等通信任意两个节点都可以进行通信这意味每个节点都可以向其他节点请求服务同时也能提供服务。每个结点既是客服端优势服务器 自拓展性新加入的节点带来了新的服务能力同时这些新节点也会带来新的服务请求增加网络的负载。 间歇性连接和动态IPP2P网络中的节点不保证一直在线并且它们的IP地址可能会改变。这是因为许多P2P网络的节点是用户的个人设备例如家用电脑或移动设备。 由于P2P网络的去中心化特性它们通常难以管理。例如没有一个中心点可以有效地实施安全策略或确保服务质量。 使用P2P网络的例子 Gnutella一种流行的文件共享P2P网络它允许用户直接交换文件。迅雷Xunlei一种集成了P2P下载和多种下载协议的下载管理软件主要在中国使用。 C/S和P2P体系结构的混合体 Napster混合体系结构 文件搜索集中式 资源注册用户将自己的文件资源注册在中心服务器上这样其他用户就可以知道哪些资源可用。查询资源当用户想要找到特定的文件时他们会向中心服务器查询资源的位置。服务器作为中央索引响应查询并提供文件所在的主机地址。 文件传输P2P 直接传输文件的实际传输是在两个对等节点Peer之间进行的而不经过中心服务器。 即时通信 在线检测集中式 用户上线注册当用户上线时他们会向中心服务器注册自己的IP地址这样服务器就能跟踪哪些用户当前在线。查找在线好友用户可以询问中心服务器以确定他们的好友是否在线以及好友的当前IP地址。 两个用户之间聊天 直接通信P2P 混合体系结构的优势 效率与可扩展性通过利用集中式服务器进行资源索引和管理混合体系结构提高了搜索效率。同时P2P的文件传输减轻了服务器的负载提高了整体系统的可扩展性。资源发现集中式服务器提供了快速的资源发现机制使用户能够高效地找到他们需要的内容。负载分散文件传输在用户之间直接进行分散了带宽使用降低了对中央服务器资源的需求 进程通信 进程 定义 指在主机上运行的应用程序的实例。每个进程都是一个正在执行的程序它具有自己的代码和数据空间以及其他系统资源如文件描述符和网络连接。 进程间通信 同一主机内在同一主机内进程间通信IPC机制允许进程互相交换数据。这通常是由操作系统提供支持的包括管道、消息队列、共享内存等方式。 不同主机在不同主机上的进程通过网络进行通信常见的是通过交换报文的方式。这种通信要求使用网络协议来确保数据的正确传输。 OS通信服务操作系统提供的网络通信服务允许进程通过网络接口发送和接收消息。应用协议进程根据特定的应用层协议交换消息如HTTP、FTP、SMTP等。这些协议定义了数据交换的格式和规则。 传输层服务传输层如TCP或UDP为进程提供端到端的通信能力。TCP提供可靠的、面向连接的服务而UDP提供不可靠的、无连接的服务。 客户端服务器进程 客户端进程 发起通信客户端进程是指主动发起通信的进程。在Web浏览的场景中当你点击一个链接时浏览器客户端进程会向服务器发送请求。 服务器进程 等待连接服务器进程是指在网络端口上监听并等待连接请求的进程。当服务器进程接收到请求时它会响应并可能提供所请求的服务。 注意事项 P2P架构中的进程即使在P2P架构中也存在客户端和服务器进程的概念。在P2P网络中的每个节点都可能同时运行客户端和服务器进程客户端进程发起请求服务器进程响应请求。 分布式进程通信需要解决的问题 问题一进程标识和寻址问题服务用户 服务用户进程需要被唯一标识以便用户或其他进程可以找到它们。寻址进程必须有一个方式来寻址其他进程这通常涉及到IP地址和端口号。在IP网络中IP地址确定主机端口号确定主机上的特定进程。 问题二传输层与应用层的服务接口服务 服务位置层间接口的服务接入点Service Access Point, SAP在TCP/IP网络中这通常是指socket。服务形式应用程序接口Application Programming Interface, API在TCP/IP网络中这通常是指socket API。API定义了应用程序可以用来请求网络服务的函数和过程。 问题三如何使用传输层提供的服务实现应用进程之间的报文交换实现应用用户使用服务 应用层协议定义了报文的格式、含义以及发送和接收报文的时序。应用层协议规定了如何封装数据如何解释接收到的数据以及在通信过程中各个步骤的顺序。程序编写开发者需要编写程序使用操作系统提供的API来调用网络基础设施。这些调用实现了报文的发送和接收满足了应用层协议定义的时序和逻辑。 问题1对进程进行编址Addressing 在网络通信中为了确保报文正确送达目的地我们需要准确地标识网络中的进程。这个过程称为对进程进行编址或地址分配。 进程为了接受报文必须有一个标识即SAP发送需要标识。 主要组成 主机标识每台主机在网络中都有一个唯一的标识即IP地址。在IPv4中这是一个32位的数字通常以点分十进制形式表示比如 192.168.1.1。 进程标识 端口号由于单个主机上可能同时运行多个网络应用进程仅靠IP地址无法区分这些进程。因此需要端口号来唯一标识主机上的具体进程。端口号是一个16位的数字与IP地址一起用来定义网络中的一个端节点endpoint。传输层协议指定进程使用的传输层协议如TCP或UDP确保数据正确的传输。 某些端口号被预先分配给特定的服务。例如HTTP服务通常使用端口80而FTP服务使用端口21。 端节点标识 IP地址端口号一个进程可以通过其所在主机的IP地址加上自己的端口号来进行唯一标识。这种组合确保了在网络中可以找到并与特定的进程通信。 通信实体 任何两个主机进程之间的通信都可以被视为两个端节点之间的通信。 问题二传输层提供的服务——需要穿过层间的信息 层间接口必须携带信息 当应用层的进程向另一个进程发送数据时它需要向传输层提供一系列明确的信息以便传输层可以正确地处理和封装这些数据。这些信息包括 要传输的报文 服务数据单元SDU这是从应用层传递到传输层的数据传输层将其封装成协议数据单元PDU以供网络传输。 谁传的发送方的应用进程标识IP TCP(UDP)端口 源IP地址发送方主机的IP地址。源端口标识发送方应用进程的端口号。这通常是一个短暂的端口由操作系统在应用程序发起网络通信时分配。 传给谁接收方的应用进程标识对方的IP TCP(UDP)端口 目标IP地址接收方主机的IP地址。目标端口标识接收方应用进程的端口号。 传输层实体的封装过程 传输层实体TCP或UDP会创建一个新的段对于TCP或数据报对于UDP这个过程称为封装。 封装内容 源端口号和目标端口号这些信息被包括在TCP段或UDP数据报的头部用于确保数据在到达目的主机后能够被发送到正确的应用进程。数据来自应用层的原始数据将被放入TCP段或UDP数据报的数据部分。 与IP层的交互 IP地址交付封装好的TCP段或UDP数据报会被传输到网络层IP层。网络层使用提供的源IP和目标IP地址来进一步封装数据确保它可以在网络中正确路由到目标主机。 问题二传输层提供的服务——层间信息的代表 Socket API的复杂性 如果每次通过Socket API发送报文时都需要手动指定完整的信息如源IP、源端口、目标IP、目标端口过于繁琐易错不便于管理。 Socket作为代号 为了简化这一流程引入了Socket的概念。Socket在这里充当一个标识符或句柄handle类似于操作系统重文件操作的句柄。 当操作系统打开一个文件时它返回一个句柄程序通过这个句柄进行读写操作。同理Socket就是网络通信的句柄。 TCP Socket 在TCP/IP模型中两个进程间的通信在开始之前需要建立一个连接这就是TCP协议的特性确保了数据的可靠传输。 一旦TCP连接建立两个进程之间的通信就可以在这个稳定的连接上持续进行。这种通信关系是持久的并且在通信期间是稳定的。 在操作系统级别这个通信关系通常用一个整数Socket描述符来本地表示这样就减少了应用程序处理的复杂性。 使用Socket的方法最小化了应用层和传输层之间需要传递的信息量。在建立了TCP连接后程序只需要操作这个Socket而不是每次通信都指定完整的网络层信息。TCP Socket的操作只涉及源IP、源端口、目标IP和目标端口的信息这在内部已经由操作系统和网络堆栈维护。 TCP Socket的定义 TCP socket是TCP/IP网络中用于实现两个进程间可靠通信的端点。每个TCP socket由一个四元组唯一定义这个四元组包括源IP地址、源端口号、目标IP地址、目标端口号。 TCP Socket的特点 通信前两个进程必须先建立连接这个过程称为“三次握手”。连接一旦建立两个进程之间的通信就可以在这个稳定的连接上进行。通信结束后双方会通过“四次挥手”的过程来关闭连接。 下面是TCP Socket通信机制概念图展示了TCP Socket在应用层和传输层之间提供了一个接口。 通信流程程序一个进程首先创建创建一个socket并指定目标IP和端口通过这个socket程序可以发起一个到服务器的连接请求连接成功后双方就可以开始数据交换。 如图主机1具有IP地址 1.1.1.1这台主机的一个进程想要与主机2进行通信为此它创建一个源端口号为233的TCP socket 11111主机1的进程使用这个socket发送数据到主机2的IP地址 2.2.2.2为端口号为80的服务。而主机2收到来及主机1的请求后主机2使用端口号为80的TCP socket22222来回复主机1。 UDP Socket UDP是一个无连接的网络服务允许两个进程之间的通信而无需建立连接。 在UDP中每个发送的数据包报文都是独立传输的而且每个数据包都可能被发送到不同的目标进程。 由于UDP报文是独立传输的前后两个报文可能被发送给同一个或者不同的接收进程。这意味着接收方不能仅凭接收到的报文顺序来重建发送方的会话状态。 因此UDP Socket只能由一个整数socket描述符来标识本地应用实体。 并且使用UDP Socket传递给传输层的信息量最小。基本上只需要知道源端的IP地址和端口号。 尽管UDP不需要建立连接但在发送报文时发送方必须指定目标的IP地址和端口号这样数据才能被正确地路由到接收方的进程。 接收方在接收到数据包时传输层会提供发送方的IP和端口号以便应用层知道数据来自哪里并且可以选择如何响应。 UDP Socket的定义 UDP socket是一种网络通信端点用于通过UDP协议发送和接收数据。与TCP socket不同UDP socket不需要在通信前建立连接。 UDP Socket的标识 UDP socket在操作系统层面是由一个“2元组”IP地址和端口号标识的。这个2元组定义了数据包的发送或接收端点。源端的应用程序在创建UDP socket时会指定一个端口号操作系统会与应用程序所在的主机的IP地址一起使用这个端口号来标识这个socket。 发送数据报的过程 当应用程序准备发送数据时它使用已创建的UDP socket。因为这个socket已经与一个特定的IP地址和端口号关联应用程序不需要在每次发送数据时重新指定自己的IP和端口号。不过每次发送数据时应用程序必须指定目标的IP地址和UDP端口号。这是因为UDP是无连接的每个发送的数据报可能都有一个不同的目的地。 套接字Socket 套接字是计算机网络中的一个抽象层它为应用层进程提供了发送和接收数据的方法。它是应用层与传输层之间的接口。 套接字的作用 套接字将复杂的网络通信过程封装起来提供了一个简单的接口供应用程序使用无需处理网络协议的细节。它允许应用程序仅通过简单的发送和接收操作来完成复杂的网络数据交换。 网络协议栈 每个发送和接收数据的应用程序都有自己的网络协议栈。网络协议栈负责处理各种网络通信规则和过程包括数据的封装、寻址、路由以及错误处理等。 端到端的通信 套接字提供了端到端的通信。当一个应用程序进程想要和另一个进程通信时它们通过Internet使用各自的套接字进行数据交换。 问题三如何使用传输层提供的服务实现应用 定义应用层协议 应用层协议定义了运行在不同端系统上的应用如何相互交换报文。它规定了报文的格式、字段的语义以及发送和响应报文的时序规则。 编制程序 程序需要通过应用编程接口API调用网络基础设施来发送和接收报文以及实现应用所需的时序和逻辑。 应用层协议 定义了运行在不同端系统上的应用进程如何相互交换报文。 报文类型定义了通信过程中需要交换的报文类型例如请求报文和应答报文。报文语法指定了报文中各个字段的结构包括字段的顺序、类型、大小等。字段语义解释了各个字段的含义即如何解释这些字段中的数据。报文处理规则规定了进程何时和如何发送报文以及如何对收到的报文进行响应。 应用协议的作用 应用层协议是构成一个完整网络应用的多个部分之一。例如在Web应用中HTTP协议定义了客户端和服务器之间的通信规则。Web客户端如浏览器、Web服务器和网页内容如HTML也是应用的组成部分。 公开协议与专用协议 公开协议Open Protocol 这些协议由RFCRequest for Comments文档定义并且是公开的这意味着任何人都可以使用这些协议来创建兼容的软件和设备。公开协议的例子包括HTTPWeb通信和SMTP电子邮件传输它们支持不同厂商和应用之间的互操作性。 专用协议Dedicated Protocol 专用或私有协议不公开通常是由单个组织控制并且可能只用于其产品内部。如Skype使用的是一种专用协议它的具体实现细节并不公开这可能限制了与其他产品或服务的互操作性。 如何描述传输层的服务 数据丢失率 某些应用如文本信息要求数据绝对可靠不能有任何丢失。 有些应用如音频能容忍一定程度的数据丢失。 吞吐 保证吞吐量一些应用如流媒体视频需要有保证的最小吞吐量以确保流畅播放。 弹性吞吐量有些应用如文件下载可以适应网络吞吐量的变化即当网络条件好时可以提高速度网络条件差时可以减速。 延迟 低时延实时应用如网络电话VoIP或在线游戏要求传输延迟非常低以保持良好的用户体验。 高时延容忍如电子邮件或网页浏览用户通常可以接受稍长的延迟。 安全性 机密性某些应用需要保证数据传输的私密性不被未授权的第三方所窥视。完整性数据在传输过程中必须保持完整不能被篡改。认证性传输双方都需要能够验证对方的身份确保通信的合法性。 Internet 传输层提供的服务 TCP 服务 可靠传输TCP提供可靠的数据传输服务保证数据的正确顺序和完整性。流量控制确保发送方的数据传输速度不会超过接收方的处理能力。拥塞控制在网络拥塞时减少数据的发送防止网络拥堵加剧。连接导向在数据传输前需要在发送方和接收方之间建立连接。不能提供的服务TCP不提供时间保证、最小吞吐保证和安全性如加密。 UDP服务 不可靠数据传输UDP不保证数据包的顺序或完整性。不提供的服务UDP没有流量控制、拥塞控制也不保证带宽或低延迟。无需连接UDP不需要在传输数据前建立连接减少了延迟。 为什么要有UDP UDP存在的必要性 UDP的存在有几个关键的必要性和优势 能够区分不同的进程而IP服务不能 虽然IP协议提供了主机到主机的通信但它本身不能区分一台主机上运行的不同应用进程。UDP在端到端的通信基础上通过端口号区分了不同的应用进程。这允许同一网络层IP地址的不同进程接收其特定的数据包。 无需建立连接 省去了建立连接的时间使得UDP非常适合需要快速数据交换的事务性应用如DNS查询。 不保证可靠性 UDP不提供数据重发机制如果数据包在传输中丢失UDP不会尝试重新发送。这缺乏可靠性的特点使UDP适合那些对实时性要求高的应用比如实时视频或语音通信这些应用可以容忍一些数据包的丢失而无需等待重发这样可以减少延迟。 没有拥塞控制和流量控制 UDP允许应用程序以其决定的速度发送数据而不会因网络拥塞而降低速度。这与TCP不同TCP会根据网络状况动态调整数据发送速度以避免过多的数据包引起网络拥塞。 安全TCP TCP和UDP 加密标准的TCP和UDP本身不提供加密功能。 明文传输由于TCP和UDP不加密数据所有通过互联网的数据传输都是透明的可以被任何路由数据包的中间节点读取。 SSL安全套阶层 实现在TCP之上SSL是在TCP协议之上实现的它在传输层和应用层之间提供一个加密层。这个加密层为TCP连接提供了安全性增强。 私密性SSL使用加密算法确保数据在传输过程中的私密性防止数据被未经授权的第三方读取。 数据完整性SSL提供完整性检查确保数据在传输过程中没有被篡改。 端到端鉴别SSL支持使用数字证书进行端到端鉴别这确保了通信双方的身份。 SSL在应用层的使用 SSL库应用程序可以使用SSL库如OpenSSL来实现安全通信。这些库利用TCP协议提供的通信服务但在发送数据前先进行加密。SSL socket API应用程序通过特定的API可以将数据交给socket进行通信。如果应用程序使用SSL socket API那么SSL层将负责在数据发送到网络之前将其加密。 Web和HTTP Web页面通常是由多个对象组成这些对象可能是HTML文件JPEG图像、可执行的客户端程序如Java小程序… 一个Web页面通常有一个HTML文件这个HTML文件通过超链接引用又包含了若干个对象嵌入在HTML文件中。 每个Web对象都可以通过一个URL进行引用和访问。URL指定了如何找到和访问互联网上的资源。 URL 格式 协议名Prot如 http 或 https定义了客户端和服务器之间通信的协议。用户名user用于认证的用户名通常和密码一起出现。口令psw与用户名对应的密码用于访问控制。主机名资源所在的服务器地址如 www.someSchool.edu。端口port服务器上服务监听的端口号。如果未指定将使用协议的默认端口。路径名资源在服务器上的具体位置如 /someDept/pic.gif。 HTTP概述 HTTP或超文本传输协议是Web上使用的主要应用层协议。它基于客户端/服务器模型工作涉及Web浏览器客户端和Web服务器之间的交互。 在以HTTP为背景下的客服/服务器模式的通讯过程 客户端角色 首先客服端通常是Web浏览器启动通信过程。用户输入URL或点击链接浏览器将这些动作转换为HTTP请求。HTTP使用TCP协议来保证数据传输的可靠性并向服务器的特定端口发起连接。建立连接后浏览器将HTTP请求发送到服务器。请求包含请求方式如GET、POST、目标资源的URL和HTTP版本还可能包含请求头如用户代理、接受的内容类型和请求体通常用于POST请求。 服务器角色 服务器接收到HTTP请求后首先解析请求并定位请求的资源。然后服务器想客户端发送HTTP响应包括一个状态码如200表示成功响应头包含有关响应的元数据和响应体请求的资源内容。如果请求的是一个文档或图像该资源将作为响应体传输。对于动态内容服务器可能会实时生成响应。 TCP连接的维护和关闭 持久连接在HTTP/1.1及更新版本中默认使用持久连接Keep-Alive允许在同一连接上发送多个请求和响应减少了连接和断开的次数。连接关闭如果客户端或服务器决定结束会话它们将关闭TCP连接。在HTTP/1.0中每个请求/响应后通常会关闭连接。 无状态协议 HTTP是一个无状态协议意味着服务器不保存任何关于客户端请求的状态信息。 为了客服这一限制Web应用通常使用Cookie来维护用户状态。 HTTP链接 非持久HTTP HTTP/1.0协议 每个请求/响应都需要建立一个新的TCP连接请求完成后立即关闭TCP连接。 最多只能在一个TCP连接上发送一个对象如果需要下载多个对象就需要建立多个TCP连接。 这样做的好处是可以减少服务器的资源消耗因为每个TCP连接都需要占用一定的缓冲区和变量。但是这样做的缺点是会增加客户端和服务器之间的网络延迟因为每次发送一个请求都需要重新建立新的TCP连接。 持久HTTP HTTP/1.1协议 连接可以用于多个请求/响应会保持一段时间再关闭。 多个对象可以在一个TCP连接上述传输不需要每个对象建立新连接。 优点包括1. 减少了建立和关闭连接的消耗和延迟特别是高延迟的网络下性能得到显著提高。 非持久连接 非持久HTTP连接操作的过程 假设用户输入URLwww.someSchool.edu/someDept/home.index包含文本和10个JPEG图像的引用。 建立TCP连接 HTTP客户端浏览器在端口号80向服务器 www.someSchool.edu发起TCP连接。 这个连接的建立大约需要一个往返时间RTT。 服务器在端口80监听连接请求一旦接收到就接受链接并返回客户端表示连接已经建立。 发送HTTP请求 一旦TCP连接建立浏览器通过向TCP连接的套接字发送HTTP请求报文报文表示客服端需要对象 someDepartment/home.index。 服务器处理并相应 服务器接收到HTTP请求报文后查找请求的 home.index文件找到文件后服务器将其数据封装在一HTTP响应报文中并通过TCP连接的套接字回传给客户端。 关闭TCP连接 一旦响应报文发送完成服务器关闭TCP连接。 客服端渲染HTML HTTP客服端接收到HTML文件后在用户的浏览器中渲染出来。 浏览器解析HTML内容检查页面中的其他资源例如图像、CSS文件、JavaScript文件等。 重复请求资源 对10个JPEG对象重复 1 − 5 1-5 1−5 步。 响应时间RTT模型 往返时间RTTround-trip timeRTT是指一个小的分组从客户端出发到服务器然后再返回客户端的总时间。传输时间忽略 非持久HTTP连接的响应时间组成 第一个RTT用于初始化TCP连接。 客户端发送一个SYN包到服务器等待服务器响应SYN-ACK然后客户端回复ACK以完成三次握手。 第二个RTT用于发送HTTP请求并等待HTTP响应。 一旦TCP连接建立客户端发送HTTP GET请求并等待服务器回复包含所请求文件的HTTP响应。 最后文件的传输时间取决于文件大小和网络带宽。 总的响应时间是2RTT加上文件的传输时间。 持久连接 非持久HTTP的缺点 每个对象需要两个RTT操作系统必须为每个TCP连接分配资源包括内存和处理器时间。为了减少加载时间浏览器通常会同时打开多个TCP连接来并行获取引用的对象。 持久HTTP的优点 服务器发送响应后仍保持TCP连接。在相同客户端和服务器之间的后续请求和响应报文通过相同的连接进行传送。当客户端遇到引用对象时它可以立即在保持打开状态的TCP连接上发送请求而不需要等待前一个相应完成。 持久HTTP的两种模式 在持久HTTP下有两种主要的请求/响应模式非流水方式和流水方式。 非流水方式的持久HTTPNon-pipelined Persistent HTTP 在非流水方式的持久HTTP中客户端需要等待前一个响应被完全接受后才能发出下一个请求。这个模式下每个引用对象的获取还是需要花费一个RTT。 流水方式的持久HTTPPipelined Persistent HTTP 流水方式是HTTP/1.1的默认模式。这种模式下客户端不必等待前一个响应可以连续不断地发送多个HTTP请求。所有引用小对象只花费一个RTT是可能的。 HTTP 报文 HTTP有两种类型的报文请求、响应 HTTP请求报文 HTTP请求报文由ASCII码组成人能阅读 请求报文的组成部分 请求行包含方法如GET、POST、HEAD、请求的资源URL以及HTTP版本。例如 GET /somedir/page.html HTTP/1.1首部行包含了各种首部字段用来传递关于请求、客户端、所请求资源的额外信息。常见的首部行包括 Host: 指定请求的服务器的域名。User-agent: 标识发出请求的浏览器或其他客户端。Connection: 指示连接的类型如 close表示不持久连接。Accept-language: 指定客户端优先接受的语言例如法语fr。 换行回车符在首部行后使用一个单独的换行回车符通常是 \r\n来表示报文头部的结束。 实体正文在请求报文中可能不存在如果是POST或PUT等类型的请求实体正文会包含发送给服务器的数据如表单内容。 通过HTTP协议向服务器提交表单数据的两种方法 描述了通过HTTP协议向服务器提交表单数据的两种方法使用POST方法和使用URL查询字符串通常与GET方法结合使用。 POST方式 用户通过Web表单输入数据时这些数据会被包装在HTTP请求的实体正文entity body中。用户点击提交后表单数据被发送到服务器。POST请求的实体主体不会显示在URL中。 例如如果有一个表单是用于搜索动物用户可能会在表单中输入monkeys和banana作为搜索词这些词会被包含在POST请求的实体主体中发送到服务器。 URL方式 方法GET用于请求服务器上的资源。用户的输入被添加到URL的查询字符串部分并通过请求行的URL字段发送。这种方法将所有的参数和参数值作为URL的一部分通常用于搜索查询和页面请求。在查询字符串中参数和它们的值通过特定的格式附加到URL之后。参数之间通常由 符号分隔参数名和参数值之间由 符号连接。 例如 www.somesite.com/animalsearch?monkeysbanana这个URL中monkeys和banana是添加到查询字符串的搜索参数但没有明确的参数名。http://www.baidu.com/s?wdxxyyzzzcl3在这个例子中“wd”和“cl”是参数名“XXYYzzz”和“3”是这些参数的值。在URL中空格通常被替换为 符号或者 %20。 方法类型 在HTTP协议中方法类型定义了客户端可以对服务器上的资源执行的操作。不同版本的HTTP协议支持不同的方法集合。 以下是HTTP/1.0和HTTP/1.1中常见方法类型 HTTP/1.0 GET 用于请求访问服务器上的指定资源。发送的请求中包含URL服务器响应该请求并返回URL指定的内容。GET请求可以通过URL传递参数常用于网页请求和简单的数据检索。 POST 用于向服务器提交要被处理的数据。例如可以是表单数据或者文件上传。数据包含在请求的实体主体entity body中并不会显示在URL中。 HEAD 类似于GET方法但服务器在响应中只返回首部。这意味着响应中不包含实体主体部分。HEAD请求常用于故障跟踪如检查页面是否存在、查看资源类型或者检查响应首部。 HTTP/1.1 GET、POST、HEADPUT 允许客户端将文件上传到服务器中指定的URL。如果指定URL的文件已存在则PUT方法通常会覆盖它。如果文件不存在服务器可能会根据请求创建一个新的资源。 DELETE 请求服务器删除指定URL的资源。实际上是否执行删除操作取决于服务器的配置和权限设置。这意味着即使客户端发出了DELETE请求服务器也可能拒绝这个请求。 HTTP响应报文 HTTP响应报文由服务器发送给客户端以响应客户端之前发出的请求。报文的结构通常包括状态行、首部行以及可选的消息正文。 响应报文的组成部分 状态行包含协议版本、状态码、状态文本。 HTTP/1.1 200 OK\r\n协议版本HTTP/1.1指明了服务器使用的HTTP协议的版本。状态码200这是一个三位数字的代码表示请求处理的结果。状态码200表示请求已经成功被服务器处理。状态文本OK对状态码的简短文本描述200状态码对应的是“OK”表示请求成功。 每个部分之间用空格分隔并且状态行以回车换行符\r\n结束。 首部行紧随状态行之后的是一系列的首部行它们提供了关于服务器和响应的额外信息 Connection: close 告诉客户端服务器将在完成本次响应后关闭TCP连接。Date: 提供了服务器发送响应的日期和时间。Server: 描述了服务器的软件信息这里是运行在Unix系统上的Apache 1.3.0服务器。Last-Modified: 说明了请求的资源最后一次被修改的时间这对于缓存机制非常重要。Content-Length: 响应正文的长度这里是6821字节。Content-Type: 响应正文的MIME类型这里是 text/html表示发送的是一个HTML文档。 每个首部行由首部名、冒号、空格以及首部值组成并且每一行都以 \r\n结束。 首部行和消息正文之间有一个空行\r\n标记着首部的结束和消息正文的开始。 消息正文包含了实际的响应内容如请求的HTML页面。 消息正文的具体内容应与首部行中的 Content-Type和 Content-Length一致。 HTTP响应状态码 状态码是标准化的它们被分为几个不同的类别从1xx信息性状态码到5xx服务器错误。 200 OK 请求成功请求对象包含在响应报文的后续部分 301 Moved Permanently 请求的对象已经被永久转移了; 新的URL在响应报文的Location: 首部行中指定 客户端软件自动用新的URL去获取对象 400 Bad Request 一个通用的差错代码表示该请求不能被服务器解读 404 Not Found 请求的文档在该服务器上未被找到 505 HTTP Version Not Supported 这个状态码表示服务器不支持或者拒绝支持请求消息中使用的HTTP协议版本。 通常发生在客户端使用服务器不支持的新版本或者过时的HTTP版本时。 Cookies Cookies在用户与服务器之间维持状态时发挥着关键作用尤其是在HTTP这种无状态的协议中。 Cookies的4个组成部分 HTTP响应中的Cookie首部行 当用户第一次访问支持Cookies的网站时服务器通过HTTP响应报文中的 Set-Cookie首部行向用户浏览器发送一个或多个Cookies。这些Cookies通常包含一个唯一的标识符用来识别用户。 HTTP请求中的Cookie首部行 一旦用户的浏览器接收到Cookies并且用户再次请求同一网站的资源时浏览器会自动将之前保存的Cookies附加在HTTP请求的首部行中发送回服务器。这样服务器就可以读取这些Cookies并识别出是哪位用户再次发起请求。 用户端的Cookie文件 用户的浏览器会在本地存储Cookies通常每个网站都有自己的Cookies。这些Cookies包含了用户的登录信息、偏好设置、购物车内容等它们存储在用户设备上的特定目录中。 Web站点的后端数据库 服务器端会有一个数据库来存储与Cookies相关的信息。当收到含有特定Cookie的请求时服务器可以查询数据库了解用户的偏好、购物历史、账户信息等。 例子 假设有一个用户我们称她为Susan。Susan通常使用同一台PC和Internet Explorer浏览器上网。当Susan首次访问一个电子商务网站时她的浏览器通过HTTP请求向服务器请求页面。服务器响应这个请求同时在HTTP响应中使用 Set-Cookie首部行发送一个唯一的ID作为Cookie。Susan的浏览器存储了这个Cookie并在之后每次请求该网站时都会在HTTP请求中包含这个Cookie。服务器收到含有Cookie的请求后检索后端数据库识别Susan的ID并根据存储的信息定制响应例如加载她的购物车内容。 Cookies能带来什么 用户验证购物车推荐用户状态Web e-mail 如何维持状态 协议端节点在客户端和服务器端多个事务或会话之间的状态信息通过Cookies在HTTP报文中被携带以此方式维持状态。HTTP报文中的CookiesHTTP请求和响应报文中的 Cookie和 Set-Cookie首部行被用来传输Cookies从而实现在无状态的HTTP协议中维护用户状态的目的。 Cookies与隐私 Cookies通过允许网站跟踪用户的行为和偏好来增强用户体验但这也可能影响用户的隐私。网站可能会将收集到的信息用于非原始意图的目的或者出售给第三方如广告公司这可能导致用户的浏览习惯和个人信息被非授权方访问。使用Cookies的搜索引擎和广告网络能够在用户访问各种网站时跟踪他们的活动进而建立起用户的行为模式这可能用于目标广告或其他形式的营销活动。 Cookies的工作流程 下面来讲解Cookies在客户端和服务器之间如何工作以及他们是如何在HTTP请求和响应中被发送的。 用户首次访问服务器 用户通过浏览器访问一个网站浏览器发送一个普通的HTTP请求到服务器。 服务器设置Cookie 服务器响应用户的请求并在HTTP响应中通过 Set-cookie首部行发送一个Cookie。例如Set-cookie: 1678其中 1678可能是分配给用户的唯一标识符。 浏览器存储Cookie 用户的浏览器接收到这个Cookie并将其存储起来。这个Cookie将与服务器的域名相关联。 后续的请求 当用户再次访问该服务器时或者请求服务器上的其他资源浏览器会在新的HTTP请求中包含之前保存的Cookie。这通过 Cookie首部行完成如 Cookie: 1678。 服务器识别用户 服务器接收到新的请求后识别出 Cookie首部行它可以查找后端数据库中与该Cookie相对应的用户信息比如用户的偏好设置、账户信息等。 个性化内容的提供 基于Cookie提供的信息服务器可以为用户提供个性化的内容例如向用户显示一个个性化的购物车或者根据用户的浏览历史推荐商品。 Web缓存代理服务器 Web缓存是一种特殊的网络服务它存储过去请求的Web资源副本如网页、图片和文件。当Web缓存存在时它可以作为客户端和原始服务器origin server之间的中间实体即充当代理服务器。 工作原理 用户在浏览器中进行设置以通过缓存代理服务器访问Web当浏览器向Internet发送HTTP请求时这些请求会被发送到配置的缓存缓存会检查它是否有请求的对象的副本 如果有缓存直接将对象返回给客户端不需要从原始服务器获取从而减少了访问时间。如果没有缓存将向原始服务器发出请求获得对象后存储在本地并将对象返回给客户端。 Web缓存的位置 作为客户端对用户的浏览器来说缓存作为获取资源的来源。作为服务器对原始服务器来说缓存作为请求资源的客户端。 好处 减少请求响应时间 缓存降低了用户从请求资源到接收资源所需的时间。减少内部网络流量 在一个机构内部网络安装缓存可以减少进出Internet的流量因为内部用户请求的许多资源可能直接从缓存获取。优化内容提供 缓存可以使内容提供商即使没有高性能的基础设施也能有效提供内容。流行内容的副本存储在缓存中降低了原始服务器的负担并为用户提供了更快的访问速度。 条件GET方法 条件GET方法用于主要用于判断缓存中的对象是否为最新版本从而决定是否需要从原始服务器重新下载该对象。 工作原理 目标 主要目的是避免不必要地重新发送数据。如果缓存服务器上的对象副本是最新的那么从原始服务器获取相同的对象就没有必要。 缓存器的请求 当缓存服务器向原始服务器发送HTTP请求时它会在请求中包含一个特殊的头部If-Modified-Since: date。这个头部指定了缓存服务器上该对象的最后修改日期。 服务器的响应 如果自指定日期以来对象没有被修改服务器会响应一个状态码 304 Not Modified。这意味着对象自上次缓存以来没有发生变化因此不需要重新下载。如果对象自上次缓存以来已被修改服务器会发送一个正常的响应通常是 200 OK并附带最新的数据。 例子 对象未修改 缓存服务器发送HTTP请求包含 If-Modified-Since: date。原始服务器发现对象自指定日期以来未修改。响应为 HTTP/1.0 304 Not Modified不包含对象数据。缓存服务器继续使用其缓存副本。 对象已修改 缓存服务器发送类似的请求。原始服务器检测到对象已被修改。发送 HTTP/1.0 200 OK响应附带最新的数据。缓存服务器更新其缓存副本。 重要性和效益 减少带宽使用避免不必要的数据传输。快速响应如果数据未修改可以立即从缓存提供无需等待网络传输。节省服务器资源服务器不需要发送完整的数据只需发送状态响应减少了处理和带宽的需求。 FTP FTPFile Transfer Protocol文件传输协议 FTP的定义FTP是一种网络协议用于在客户端和服务器之间传输文件。它可以将文件上传到远程主机或从远程主机下载文件。 客户端/服务器模式 客户端用户使用客户端软件发起与服务器的连接以进行文件传输。服务器远程主机运行FTP服务器软件响应客户端请求并管理文件传输。 标准FTP协议的细节和规范在RFC 959文档中有所描述这是FTP通信标准的正式定义。 端口号FTP服务器通常在网络上的21号端口上监听来自客户端的连接请求。 FTP: 控制连接与数据连接分开 FTP客户端与FTP服务器的连接 FTP客户端通过端口21与FTP服务器建立控制连接这个控制连接用于传输命令和控制信息而不是文件数据本身并使用TCP为传输协议。 身份确认和命令传输 客户端通过控制连接进行身份确认通常发送用户名和密码来实现。一旦控制连接建立客户端可以通过它发送命令来请求服务器上的操作如获取目录列表LIST。 文件传输过程 当客户端请求文件传输时使用RETR命令下载或STOP命令上传文件服务器会响应该命令并建立一个新的数据连接用于传输文件本身。这个新的连接在端口20上。每次文件传输结束后服务器都会关闭那个特定的数据连接。对于每一个新的文件传输请求都需要打开一个新的数据连接。 控制连接的特点 带外out of band传送控制连接被认为是“带外”传送这意味着它和数据传输使用不同的通道。即使在文件数据正在传输时控制信息也能独立传送互不干扰。 服务器的状态维护 FTP是一个有状态的协议这意味着服务器会为每个客户端会话维护状态信息。这包括客户端的当前工作目录、账户信息和任何特定于会话的设置或历史记录。这样做允许在多个请求之间保持连续性和上下文。 FTP 命令、响应 命令样例USER username用于发送用户名进行身份认证。PASS password用于发送密码进行身份认证。LIST请求服务器返回远程主机当前目录的文件列表。RETR filename从远程主机的当前目录检索下载文件。getsSTOR filename向远程主机的当前目录存放上传文件。puts返回码样例这些是FTP操作中返回的状态码类似于HTTP状态码。331 Username OK, password required用户名正确需要密码。125 Data connection already open; transfer starting数据连接已打开传输开始。425 Can’t open data connection无法打开数据连接。452 Error writing file写入文件时出错。 EMail 电子邮件系统主要由三个核心组件用户代理、邮件服务器和简单邮件传输协议SMTP。 用户代理User Agent 它是用户与电子邮件系统交互的界面允许用户撰写、编辑和阅读邮件。 邮件服务器Mail Server 邮件服务器负责管理邮箱中的邮件包括维护发送给用户的邮件。邮件服务器会有一个输出报文队列用于保持待发送的邮件报文确保他们可以按顺序发送给接收者。SMTP协议邮件服务器之间利用SMTP协议来发送电子邮件报文。 客户端角色发送方邮件服务器在SMTP对话中充当客户端发起连接并发送邮件到接收方服务器。服务器角色接收端邮件服务器在SMTP对话中充当服务器接收来自发送方服务器的邮件。 电子邮件系统的工作流程通常如下 用户使用用户代理撰写一封电子邮件。用户发送邮件后邮件被传送到自己的邮件服务器。用户的邮件服务器将邮件放入输出队列。邮件服务器使用SMTP协议与接收方的邮件服务器建立连接。发送方邮件服务器将邮件传送给接收方邮件服务器。接收方邮件服务器将邮件保存起来等待最终接收者通过其用户代理检索。 SMTP SMTP使用TCP在邮件客户端和服务器之间传输邮件。默认情况下SMTP通信使用的端口号是25。 SMTP允许直接从发送方的邮件服务器传输电子邮件到接收方的邮件服务器不需要中间的转发步骤。 传输的三个阶段 握手建立连接的初始步骤通常涉及发送方服务器向接收方服务器发送问候消息。传输报文实际的邮件内容传输阶段发送方服务器向接收方服务器发送邮件数据。关闭传输结束后发送方服务器会发送命令以关闭与接收方服务器的SMTP会话。 命令/响应交互 命令SMTP客户端发送方服务器发送的指令是以ASCII文本格式编码的。响应SMTP服务器对命令的回应包括状态码和状态信息。 报文必须是7位 A S C I I ASCII ASCII码 简单的SMTP交互 S: 220 hamburger.edu服务器S向客户端C发送一个220响应码表示SMTP服务已准备好。C: HELO crepes.fr客户端发送HELO命令和自己的域名开始SMTP会话。S: 250 Hello crepes.fr, pleased to meet you服务器响应250表示成功并对客户端发出的HELO命令进行确认。C: MAIL FROM:alicecrepes.fr客户端指定发件人的电子邮件地址。S: 250 alicecrepes.fr... Sender ok服务器再次响应250确认发件人地址是有效的。C: RCPT TO:bobhamburger.edu客户端指定收件人的电子邮件地址。S: 250 bobhamburger.edu... Recipient ok服务器确认收件人地址是有效的。C: DATA客户端请求开始邮件内容的传输。S: 354 Enter mail, end with . on a line by itself服务器响应354指示客户端开始发送邮件内容以单独一行的点号(“.”)结束。客户端发送邮件正文每行代表邮件的一部分以一个单独的点号(“.”)行结束。S: 250 Message accepted for delivery服务器接收了完整的邮件内容响应250表示消息已被接受用于传递。C: QUIT客户端发送QUIT命令请求关闭连接。S: 221 hamburger.edu closing connection服务器响应221表示它即将关闭连接。 SMTP总结 SMTP使用持久连接SMTP要求报文首部和主体为7位ASCII编码SMTP服务器使用CRLF.CRLF决定报文的尾部 HTTP比较 HTTP拉pullHTTP通常用于客户端从服务器“拉取”数据如当你请求一个网页时。SMTP推pushSMTP则是用于“推送”数据如发送电子邮件到一个或多个接收者。二者都是ASCII形式的命令/响应交互、状态码HTTP每个对象封装在各自的响应报文中SMTP多个对象包含在一个报文中 邮件报文格式 首部行 To: 指明邮件的接收者。From: 指明邮件的发送者。Subject: 邮件的主题简短描述邮件的内容。 报文格式多媒体拓展 MIME多媒体邮件扩展multimedia mail extension是一种标准它扩展了电子邮件的功能允许发送和接收非ASCII字符集的内容比如多媒体文件。 首部中的MIME声明: 在电子邮件的头部信息中通过额外的行来声明邮件内容的MIME类型。这些声明包括 MIME-Version: 这行指明了邮件使用的MIME版本通常是1.0。Content-Type: 这行说明了随邮件发送的媒体类型。例如image/jpeg表明附件是一个JPEG格式的图片。Content-Transfer-Encoding: 这行表明了邮件内容的编码方式。base64是一种编码方法它允许将二进制数据转换成ASCII文本格式这样就可以通过SMTP发送。 编码的数据: 电子邮件的主体部分包含了经过编码的数据。如果是base64编码这部分将包含由字母、数字、加号和斜线/组成的字符以及在数据的最后用于填充的等号。多媒体数据的类型、子类型和参数声明: MIME类型由类型和子类型组成可以提供关于文件格式的额外信息。例如image/jpeg中的 image是类型jpeg是子类型。 邮件访问协议 用于从服务器访问和管理邮件。常见的邮件访问协议包括 POP (Post Office Protocol): 邮局访问协议其规范被定义在RFC 1939中。 IMAP (Internet Mail Access Protocol): 互联网邮件访问协议定义在RFC 1730中。 HTTP (HyperText Transfer Protocol) POP3协议 POP3邮局协议版本3常用于接收电子邮件它包含两个主要阶段用户确认阶段和事务处理阶段。 用户确认阶段 客户端命令: user: 客户端发送用户名以申明用户身份。pass: 客户端发送口令来完成认证。 服务器响应: OK: 表示成功的响应。-ERR: 表示发生错误的响应。 事务处理阶段 客户端命令: list: 请求邮件列表服务器响应每封邮件的编号和大小。retr: 根据邮件编号检索邮件内容。dele: 删除指定编号的邮件。quit: 退出会话。 POP3在默认模式下客户端连接到邮件服务器下载所有新邮件并将它们从服务器上删除。这意味着一旦下载邮件只存在于本地设备上不再服务器上。 由于邮件被下载并从服务器删除如果用户更换设备他们将无法访问那些已下载的邮件。这限制了从多个设备访问邮件的能力。 用户可以配置客户端在下载邮件后在服务器上保留邮件的副本。这允许用户在不同设备上访问邮件但不同步邮件的状态如已读/未读。 POP3在会话中是无状态的。 IMAP(Internet Mail Access Protocol) IMAP 是一种更现代且功能更丰富的邮件协议它支持复杂的邮件管理操作 邮件与文件夹的关联IMAP 允许将邮件存储在服务器上的特定文件夹中用户可以像在本地文件系统上一样管理这些邮件。目录组织用户可以在服务器上创建、删除或重命名文件夹并在这些文件夹中组织邮件。这种组织结构对于管理大量邮件非常有用。读取邮件组件IMAP 允许用户只下载邮件的某个部分如仅获取邮件的标题、结构或单个附件而无需下载整个邮件。这对于带宽有限的情况非常有用。有状态会话IMAP 会话是有状态的这意味着服务器将跟踪用户的会话状态包括用户在会话期间对邮件执行的所有操作。因此当用户在不同的客户端或设备上登录时他们会看到相同的邮件状态和组织结构。 总结 POP3——本地管理文件夹IMAP——远程管理文件夹 DNSDomain Name System DNS的必要性 标识网络设备IP地址用于唯一标识互联网上的设备如主机和路由器由于IP地址由数字组成不便人类记忆没有意义人类更倾向于使用有意义的字符串如域名来标识网络上的设备。如 tianmengpku.edu,cn所在的邮件服务器 www.pku.edu.cn。人类用户提供要访问机器的“字符串”名称。DNS负责转换成二进制的网络地址。 DNS需要解决的三个问题 如何命名设备 使用有意义的字符串好记便于人类使用。层次化命名解决一个平面命名的重名问题。如在 www.example.com中com是顶级域名example是二级域名而 www是子域名。 如何完成名字到IP地址的转换 分布式的数据库维护和响应名字查询。 如何维护增加或者删除一个域需要在域名系统中做哪些工作。 DNS的历史 ARPANET的名字解析解决方案 在ARPANET中每台计算机都被赋予了一个没有层次的唯一字符串作为主机名。这些名字构成了一个平面命名空间没有嵌套或分级的结构。当时的名字解析是通过一个中央的“维护站”来管理的该站点负责维护一张包含主机名和对应IP地址映射的文件Hosts.txt网络上的每台主机需要定期从这个维护站下载Hosts.txt文件以便本地解析主机名到IP地址。 ARPANET解决方案的问题 随着网络的扩大原始的名字解析方法开始显示出其局限性主机名分配困难没有层次的命名空间意味着所有主机名都在同一级别上这使得随着主机数量的增加命名冲突和分配变得苦难文件的管理、发布、查找都很麻烦每台主机都需要定期更新本地的Hosts.txt文件这不仅在宽带上是一种浪费而且查找时也不如动态解析高效。 DNS的整体思路和目标 DNS的主要思路 层次化、基于域的命名机制。若干分布式的数据库完成名字到IP地址的转换名字到IP地址的转换不是集中在一个单一的位置完成而是通过一个全球性的分布式数据库实现。这些数据库位于全世界的多个DNS服务器上。运行在UDP之上DNS查询通常使用用户数据报协议UDP在端口号53上进行。虽然DNS是互联网核心功能的一部分它实际上是作为一个应用层协议来实现的。DNS的复杂性被处理在网络的边缘即在端用户设备的软件或在相应的服务器上。 DNS主要目的 实现主机名与IP地址的转换name/IP translate核心功能是将人类可读的主机名如 www.example.com转换为机器可读的IP地址如 192.0.2.1以便网络通信可以正常进行。 其他目的 主机别名Host aliasing到规范名字的转换DNS允许将一个主机的别名如一个简化的名字转换为其规范的域名。邮件服务器别名到邮件服务器的正规名字的转换。负载均衡Load DistributionDNS还可以用于负载均衡通过返回不同的IP地址响应来分散到特定主机的流量。 问题一DNS命名空间The DNS Name Space DNS域名结构 层次结构DNS采用了层次树状的结构来命名网络上的设备。这样帮助避免了平面命名空间可能出现的重名问题。 I n t e r n e t Internet Internet根被划分为了几百个顶级域Top-Level Domains, TLDsTLDs分为两大类 通用顶级域gTLDs如 .com、.edu、.gov等这些是最常见的域名后缀任何个人或机构都可以注册。国家顶级域ccTLDs如 .cn、.us、.nl、.jp等这些通常为特定国家或地区保留。 在每个TLD下可以有多个子域Subdomains这些子域通常代表组织的不同部门或服务。树状结构的叶节点代表单个的主机这些是实际设备的网络地址。 域名Domain Name 从下向上的结构从本域往上直到树根TLD。中间使用 . . . 间隔不同的级别。 示例ustc.edu.cn、auto.ustc.edu.cn、www.auto.ustc.edu.cn。域的域名与主机的域名域名可以用来标识一个域如 ustc.edu.cn代表中国科学技术大学的域也可以用来指向域上的一个具体主机如 www.ustc.edu.cn指向学校的主页服务器。 域名的管理 每个顶级域TLD都负责管理其下的子域。比如.jp是日本的国家顶级域它下面可以划分为多个子域如 ac.jp通常用于学术机构、co.jp通常用于商业公司。同样.cn是中国的国家顶级域它也可以被划分为如 edu.cn教育机构和 com.cn商业组织等子域。 创建一个新的子域时需要得到上一级域的授权。例如如果某个学校想要创建 school.edu.cn这个子域它需要从负责 .edu.cn的注册机构获得授权。 域与物理网络的关系 独立于物理网络域名系统的结构是基于逻辑上的组织界限而非物理网络的布局。域名的组织和分配不受物理网络结构的限制。域和网络的独立性 主机跨网络属于某个特定域的主机可能分散在世界各地的不同物理网络上。例如一家国际公司的各个分支机构可能都在不同国家但使用同一域名下的不同子域。网络跨域一个物理网络上的不同主机可能属于不同的域。例如一个大学校园网络中可能有教育部门edu也可能有商业合作项目com。 将域名管理与物理网络解耦使得域名系统非常灵活。它可以根据组织的需求来划分和管理域名而不受地理位置或网络拓扑的限制。 问题2解析问题-名字服务器(Name Server) 名字服务器的问题 可靠性问题 单点故障的问题。如果一个名字服务器宕机它负责的域可能无法访问。扩展性问题 通信容量问题。随着请求数量的增加单个名字服务器可能难以应对负载。维护问题 远距离的集中式数据库问题。数据库距离用户越远检索信息所需的时间就越长。 区域Zone 区域的划分 区域的划分由区域管理员决定。这允许分布式管理并减少任何单一服务器的负载。DNS名称空间的划分 DNS名称空间被划分为不重叠的区域每个区域都是DNS分层树结构的一部分。名字服务器 每个区域都有一个名字服务器维护着其各自区域的权威记录。权威记录是提供对区域内域名查询的确定性数据集。名字服务器可以放置在其区域之外以确保可靠性这有助于减轻单点故障问题。 名称空间中的区域划分 权威DNS服务器 这些服务器属于组织提供可以访问的主机名和IP地址之间的映射如网站和电子邮件服务器。组织可以选择自己维护其DNS服务器或者由服务提供 商维护。 顶级域TLD服务器 顶级域服务器负责存储顶级域名的信息通常包括顶级域名如“.com”“.org”“.net”“.edu”和“.gov”和国家代码顶级域名例如“.cn”“.uk”“.fr”“.ca”“.jp”。 Network Solutions公司负责维护“.com”TLD服务器。 Educause公司是负责维护“.edu”TLD服务器的组织。 区域名字服务器维护资源记录 区域名字服务器也称区域DNS服务器是负责管理特定DNS区域内部的域名解析信息的服务器。这些服务器维护者资源记录Resource Records, RR资源记录是DNS中的基本信息单元包含了映射域名到IP地址以及其他类型的映射的数据。 资源记录Resource Records 作用维护域名到IP地址其他的映射关系。位置这些记录位于名字服务器Name Server的分布式数据库中。 RR格式 d o m a i n n a m e , t t l , t y p e , c l a s s , V a l u e domain_name, ttl, type, class, Value domainn​ame,ttl,type,class,Value Domain_name域名记录相关联的域名 T t l Ttl Ttl, time to live生存实现表示资源记录在DNS缓存中的存活时间过了这个时间缓存记录会被删除必须重新查询权威DNS服务器获取新的记录。 TTL告诉其他服务器在多长时间内可以缓存这条记录而不是每次需要时都像DNS服务器查询这样做的目的如下 缓存的目的缓存DNS记录的主要目的是提高性能。当一个递归服务器查询DNS记录并收到回应时它会将这些信息存储在本地缓存中。如果在TTL到期之前有对同一域名的查询请求递归服务器就可以直接从缓存中提供答案而不是再次进行全球性的DNS查询。这减少了解析时间降低了对权威服务器的查询压力从而提高了整个DNS解析过程的效率。删除的目的删除或更新缓存的目的是保持数据一致性。如果域名对应的IP地址或其他相关信息发生了变化老的信息仍然存储在DNS缓存中可能会导致用户无法访问该域名或者被错误地导航到旧的IP地址。因此当TTL值到期缓存的记录会被删除确保下次查询会从权威服务器获取最新的信息。 Class类别 表示记录的类别对于互联网Internet其值通常为IN代表Internet。 Value值根据不同**类型type**的资源记录。 Type类型 表示资源记录的类型。 资源记录类型 Type A Name 为主机名Value 是主机的IPv4地址 Type NS Name Server Name 是域名如foo.comValue 是该域名的权威名称服务器地址。告诉DNS查询这个特定的权威服务器是哪一个。 Type CNAMECanonical Name Name 是别名Value 是该别名的规范名字。例如例如 www.ibm.com 的规范名字为 servereast.backup2.ibm.com。 Type MXMail Exchange Value 为Name对应的邮件服务器的别名的正规名字。 DNS大致工作过程 应用程序发起请求应用调用 解析器resolver 应用程序需要访问一个域名如example.com为了将域名解析成IP地址应用程序回想系统中的解析器Resolver发送一个解析请求。 解析器向本地名称服务器发出请求 解析器抽到请求后就会向配置的本地名称服务器Local Name Server发出一个DNS查询。这个查询是封装在UDP协议的数据包中通常使用53号端口。本地名称服务器处理请求并相应 本地名称服务器首先会查看自己的缓存看是否有对应的记录。如果没有它会进一步向上级DNS服务器查询如根服务器、顶级域名服务器、权威名称服务器直到找到答案。当本地名称服务器获得了域名对应的IP地址它会将这个信息作为响应发回给解析器。解析器将响应返回给应用程序 解析器收到从本地名称服务器发来的包含IP地址的响应后就会将这个IP地址提供给发起请求的应用程序。随后应用程序就可以使用这个IP地址与目标服务器建立连接。本地名字服务器Local Name Server 本地名字服务器是DNS的一个关键组件主要有以下特征非层次结构性质 本地名字服务器并不严格属于DNS的层次结构。本地名字服务器更多地起到一个中介的角色在解析过程中相当于一种桥梁作用。与ISP关联 几乎每个互联网服务提供商ISP都会提供一个本地DNS服务供其用户使用。这些本地DNS服务器也被成为“默认名字服务器”。DNS查询的第一站 当一个主机发起一个DNS查询时这个查询首先被送到其配置的本地DNS服务器。代理作用 如果本地DNS服务器中没有缓存所需的信息它会作为代理将查询转发到DNS层次结构中的其他服务器例如向根服务器、TLD服务器或权威名字服务器查询直到找到相应的记录。一旦本地服务器接收到这些信息它会将结果返回给发起查询的主机并将记录存入缓存以加快未来的查询过程。名字服务器Name Server **名字解析过程**情况1如果请求的域名在本地名字服务器所管理的区域内部它将能够直接解析该域名并返回结果给请求主机。 情况2缓存解析cashing如果请求的域名不在本地名字服务器的区域内本地名字服务器会查看其缓存记录。如果该域名最近被解析过并且缓存的记录仍然有效即没有超过TTL本地名字服务器会使用这个缓存记录来回应请求。 当与本地名字服务器不能解析名字时联系根名字服务器顺着根-TLD一直找到 权威名字服务器。 递归查询和迭代查询 递归查询Recursive Query 在递归递归查询中客户端请求其本地DNS服务器解析一个域名。本地DNS服务器将负责整个查询过程它首先检查自己的缓存如果找到了相应记录就会返回结果。如果没有缓存记录它将向根服务器发起查询。根服务器通常不直接回答查询结果而是告诉本地DNS服务器去哪个TLD服务器查询。本地DNS服务器然后向TLD服务器查询TLD服务器再指向权威DNS服务器。本地DNS服务器继续向权威DNS服务器查询直到获取结果。完成查询后本地DNS服务器将结果返回给客户端并将结果缓存以供将来查询。 在这个过程中客户端只与本地DNS服务器交互所有的查询负担都放在了这个服务器上。 由于互联网上的每个DNS解析请求都可能涉及到根服务器导致根服务器承受巨大的查询压力。其解决方法是迭代查询。 迭代查询Iterative Query 在迭代查询中客户端请求本地DNS服务器解析一个域名但过程稍有不同本地DNS服务器首先检查自己的缓存如果找到了相应记录就直接返回结果。如果没有缓存记录本地DNS服务器将向根服务器发起查询。根服务器不会进行查询而是告诉本地DNS服务器下一个查询应当联系的TLD服务器的地址。本地DNS服务器随后直接联系TLD服务器TLD服务器也同样指出下一个联系的权威DNS服务器的地址而不是查询结果。这一过程持续进行直到本地DNS服务器联系到权威DNS服务器并得到最终的查询结果。最后本地DNS服务器将结果返回给客户端并可能缓存此结果。 迭代查询中本地DNS服务器每次查询都会得到指向下一个应当联系的服务器的指示而不是最终结果。每一步它都需要根据上一个服务器的指示继续向下查询。 DNS 协议报文 DNS协议中查询和响应报文的报文格式相同。 报文首部 标识符ID16位的字段用于标识请求以便客户端可以将响应和原始查询匹配起来保证DNS和响应的一致性。flags标志位这些标志位包含多个控制表示 查询/应答QR位 指示该报文是查询0还是响应1。希望递归RD位 表明发起查询的客户端希望DNS服务器进行递归查询。递归可用RA位 在响应中设置表明DNS服务器可以进行递归查询。权威应答AA位 如果响应来自权威DNS服务器此位被设置。 问题数# questions报文中的问题部分的问题数量。回答资源记录数#answer RRs回答部分包含的资源记录数量。权威资源记录数# authority RRs权威资源记录的数量这些记录来自权威DNS服务器。附加资源记录数# authority RRs附加信息部分包含的资源记录数量这些信息包含了有关查询的附加帮助信息。 报文的具体内容包括 问题部分questions 包含一个或多个查询的详细信息每个查询通常包括请求解析的域名和查询类型如A、MX、CNAME等。 回答部分answers 如果是响应报文这部分包含了对查询的回答即所请求的域名的资源记录。 权威部分authority 包含权威DNS服务器的资源记录提供了关于域名的权威性信息。 附加信息部分additional info 可能包含一些额外的资源记录如名称服务器的地址或其他相关记录有助于加快域名解析过程。 提高性能缓存 在DNS系统中性能的一个重要优化是使用缓存。缓存是一种机制它允许名字服务器存储最近查询过的域名到IP地址的映射信息。这样当同一个或者相近的查询再次发生时服务器可以直接从缓存中提供答案而不必每次都进行完整的查询。这减少了对上游服务器特别是根服务器和TLD服务器的查询需求从而大大提高了效率。 缓存的优点 减少延迟 由于直接从本地缓存中获取答案响应时间更快用户体验更好。减轻服务器负担 减少了对权威服务器的查询次数帮助分散了请求负荷避免了服务器过载。 缓存可能引起的问题 数据过时 如果域名的映射信息发生了变化比如IP地址更改缓存中的数据可能会过时这意味着用户可能得不到正确的解析结果。一致性问题 缓存的信息可能与权威源记录不一致导致解析错误。 解决方案 使用TTL 每个DNS记录都有一个称为“生存时间”Time to LiveTTL的值这个值告诉服务器应该缓存记录多长时间。一旦TTL到期缓存的记录就会被删除或标记为过时这样在下次有查询请求时服务器就会重新从权威服务器获取最新信息。 TTL的默认设置 TTL的值可以由域名的管理员设置不过它通常有一个默认值比如48小时。这意味着两天后缓存的信息将被视为无效需要重新查询。 问题3维护问题新增一个域 当需要引入一个新的子域时如“Network Utopia”这个过程如下 注册域名 首先为新域名 n e t w o r k u t o p i a . c o m networkutopia.com networkutopia.com选择一个或多个权威DNS服务器并向域名注册机构提供选择的权威DNS服务器的主机名和IP地址。 更新顶级域名服务器 注册机构将在.com顶级域的DNS服务器中为$networkutopia.com$添加两条资源记录Resources RecordsRRs一个NS记录指定 n e t w o r k u t o p i a . c o m networkutopia.com networkutopia.com的权威DNS服务器例如dns1.networkutopia.com。一个A记录提供权威DNS服务器dns1.networkutopia.com的IP地址例如212.212.212.1。 配置权威DNS服务器 在$networkutopia.com$的权威DNS服务器上需要配置DNS记录使得所有人都能解析到该域下提供的服务。对于网站服务配置一个类型为A的记录这个记录将 www.networkutopia.com映射到一个IP地址允许互联网用户通过浏览器访问网站。对于邮件服务配置一个类型为MX的记录这个记录指定了处理 networkutopia.com域内电子邮件的邮件服务器地址例如mail.networkutopia.com。 攻击DNS 对于DNS的攻击方式主要包括分布式拒绝服务DDoS攻击、重定向攻击和利用DNS基础设施进行的DDoS攻击。 DDoS攻击 对根服务器进行流量轰炸 在这种攻击中攻击者试图通过发送大量的流量如ping请求来使根服务器超载。尽管这种攻击听起来可能很危险但实际上这些尝试往往没有成功原因包括 根服务器的防御 根服务器通常配置有流量过滤器和防火墙能够识别并阻止恶意流量。本地DNS服务器的缓存 大多数本地DNS服务器会缓存顶级域TLD服务器的IP地址所以在大多数情况下根本不需要查询根服务器。 向TLD服务器流量轰炸攻击 攻击者发送大量的查询请求给TLD服务器。这种攻击可能比对根服务器的攻击更有潜在危险因为TLD服务器数量比根服务器少可能更容易受到影响。然而由于大多数DNS查询可以由缓存解决所以这种攻击的效果通常也是有限的。 重定向攻击 中间人攻击Man-in-the-Middle, MitM 攻击者截获DNS查询并伪造回答将用户导向恶意站点这可能是为了窃取用户信息或者散播恶意软件。 DNS缓存投毒DNS Cache Poisoning 攻击者向DNS服务器发送伪造的响应以使服务器缓存虚假的查询结果。如果成功这会导致所有依赖该服务器的客户端在查询时被导向错误的IP地址。这种攻击在技术上较为困难需要在正确的时刻截获并伪造响应。 利用DNS基础设施进行DDoS 反射放大攻击 攻击者伪造受害者的IP地址发起DNS查询请求目标DNS服务器或其他响应服务器返回比查询大得多的响应到受害者的IP地址。这种攻击利用了DNS协议中响应报文通常比查询报文大的特性从而放大攻击流量。虽然这种攻击方法可以产生较大流量但其效果通常有限因为它需要控制大量的被感染机器并利用合适的DNS服务器。 P2P应用 纯P2P架构 纯P2P模式有以下特点 没有或极少一直运行的服务器。任意端系统都可以直接连接和交换数据。利用peer的服务能力网络的负载和资源由网络的所有peers共同承担每个peer都贡献其资源、带宽…Peer结点间歇上网每次IP地址都有可能变化。 纯P2P的例子有 文件分发如BitTorrent流媒体如KanKanVoIP如Skype 文件分发 C/S vs P2P 问题从一台服务器向N个节点peer分发一个大小为F的文件所需要的时间。 文件分发时间 C/S C/S模型中一台服务器负责向多个客户端发送文件。这个分发过程的时间取决于服务器的上载带宽(us)和客户端的下载带宽(di)。 服务器的上载带宽us服务器发送文件到一个客户端所需的时间是文件大小F除以服务器的上载带宽us。要发送到N个客户端就需要这个时间乘以N因为服务器需要依次发送每一个文件副本。客户端的下载带宽di每个客户端需要下载文件的副本。如果考虑所有客户端中下载带宽最小的那个dmin则该客户端完成下载所需的时间将是文件大小F除以这个最小的下载带宽dmin。 在C/S模式下文件分发给所有客户端所需要的总时间至少是服务器发送N个副本所需时间和所有客户端中下载带宽最小的那个客户端下载文件所需的最大值。表达式为 D c − s max ⁡ { N F u s , F d m i n } D_{c-s} \max\left\{\frac{NF}{u_s}, \frac{F}{d_{min}}\right\} Dc−s​max{us​NF​,dmin​F​} 如果服务器的上载带宽是限制因素即$ \frac{NF}{u_s} \frac{F}{d_{min}} $则总时间由服务器发送所有副本的时间决定。如果客户端中的最小下载带宽是限制因素即 $ \frac{F}{d_{min}} \frac{NF}{u_s}$则总时间由下载带宽最小的客户端完成下载的时间决定。 文件分发时间 P2P模式 在P2P模式下的文件分发时间有以下几个取决因素 服务器传输服务器至少需要上载一个文件的副本。这样至少一个客户端可以开始拥有文件的副本并开始将其分发给其他节点。 发送一个拷贝的时间为 $\frac{F}{u_s} KaTeX parse error: Cant use function \( in math mode at position 5: 其中 \̲(̲ F KaTeX parse error: Cant use function \) in math mode at position 1: \̲)̲ 是文件大小 u_s$ 是服务器的上载带宽。 客户端传输在P2P网络中每个客户端在下载了文件拷贝之后也能成为一个上载源帮助分发文件。 每个客户端必须下载一个文件的副本最慢的客户端带宽最小的客户端$d_{min} 下载时间是 下载时间是 下载时间是 \frac{F}{d_{min}} $。 总体下载量考虑到所有客户端的总下载量为 N F NF NF因为每个客户端都需要一个文件的副本。 总体上载带宽不仅服务器可以上载所有客户端也可以提供上载带宽总上载带宽是服务器上载带宽与所有客户端上载带宽之和即 $u_s \sum u_i $其中 $\sum u_i $是所有客户端上载带宽的总和。 在P2P模式下分发文件所需的时间 D P 2 P D_{P2P} DP2P​ 是以上三个时间中的最大值 $ D_{P2P} \max\left{\frac{F}{u_s}, \frac{F}{d_{min}}, \frac{NF}{u_s \sum u_i}\right} $ P2P模式通常能更有效地分发文件特别是当有大量的客户端同时在线时因为它能利用所有客户端的上载带宽而不仅仅是服务器的带宽。这样随着客户端数量的增加网络的分发能力也相应增加。 P2P对等网络与客户端-服务器C/S模型在文件分发时间上的对比图表 BitTorrent BitTorrent是一种点对点Peer-to-Peer, P2P通信协议用于高效地分发大量数据避免了依赖于单个服务器的需求。它通过将文件分散成许多小块来分发每个用户下载的同时也会上传增加网络的整体带宽和文件的可用性 BitTorrent协议的工作原理 用户想要下载一个文件时首先连接到一个中央服务器tracker这个服务器跟踪所有分享该文件的用户peer的信息。用户Alice通过tracker了解哪些peer拥有文件的不同部分并与这些peers建立连接来交换文件块。 当Alice加入torrent网络开始时她没有任何文件块。她的客户端会向tracker注册并获取其他正在分享该文件的peers列表。之后Alice的客户端会尝试与这些peers建立直接的连接并开始下载文件块。同时为了遵守协议Alice也会上传她已经下载的文件块给其他peers这样她就参与到了整个网络中的文件分发。 为了提高效率BitTorrent使用了一种“稀有块优先”rarest first的策略即优先下载在网络中较为稀缺的文件块以确保所有文件块都有较好的可用性和分发速度。此外BitTorrent 还采用了“对等交换”tit-for-tat策略即用户的客户端会优先向那些向其提供数据的peers上传数据以鼓励共享和交换这是一种激励机制确保网络中的资源分享是活跃和平衡的。 稀缺块优先策略 在任意给定时间背景下网络中的某些文件块可能会比其他快更稀缺更少或者说持有这个文件块的用户少用户没上线而没有足够的资源上传这块导致下载过程的停滞。为了解决稀缺块缺少问题稀缺块优先策略是通过监控网络中的文件块分布确定哪些块是稀有的客户端优先下载这些稀缺块从而确保这些块在网络中更广泛地分布。对等交换策略 为了解决”免费搭车“问题需要一种激励机制对等交换策略的引入正是为了激励用户贡献自己的带宽并为网络中的其他用户提供文件块。这个策略基于经济学中的互惠原则意在建立一个互助合作的网络环境。对等交换策略的解决办法是通过跟踪上传到每个对等方的数据量并优先分配下载带宽给那些贡献更多上传带宽的用户。如果用户不上传或者上传很少他们的下载优先级会降低从而激励用户参与文件的上传。关键点 种子文件Torrent和跟踪器Tracker 一个用户创建一个种子文件.torrent包含目标文件的元数据如文件名大小分块信息以及tracker的信息。Tracker是一个服务器它不存储文件内容但跟踪哪些用户拥有文件的哪些部分。 开始下载 用户在下载文件时需要先加载“.torrent”文件到BItTorrent客户端后BItTorrent会联系Tracker来获取用于文件快的Peers信息。文件块是文件被分割的一小部分通常每块大小为256KB。 效率问题 BitTorrent的效率在于它能够同时利用多个用户的上传带宽这意味着随着用户数量的增加网络的整体带宽也会增加。这种方式对网络资源的使用非常高效允许文件快速地在用户之间传播。 P2P文件共享 例子 Alice使用P2P软件打算下载一个MP3文件Alice的P2P客户端通过Internet搜索其他用户Peers共享文件列表找到并选择了一个拥有这个MP3文件的PeersBob文件从Bob的PC传送到Alice的笔记本上HTTP当Alice下载的同时Alice也会上传已经下载的文件部分给掐他Peers。 所有的Peers都是服务器 可拓展性好。 上面的例子中存在两个问题 如何定位所需资源如何处理对等方的加入与离开 可能解决的方案 集中式分散式半分散式 P2P集中式目录 Napster的集中是文件设计 当对等方连接到网络时他会向中心服务器提供其IP地址和它所拥有的内容如音乐文件、视频等的列表。 当用户Alice查询一个MP3文件时服务器会查找哪些对等方拥有这个文件并将这些信息提供给Alice。 根据服务器提供的信息Alice可以直接从拥有该文件的对等方那里请求并下载文件。 文件的传输是点对点的即直接从Bob的点到传输到Alice的电脑而不是经过中央服务器。 集中式目录存在的问题 单点故障因为所有的查询和索引都依赖于一个中心服务器所以如果这个中心服务器出现故障整个网络的定位功能就会收到影响用户无法查找或下载文件。性能瓶颈随着用户数量的增加中心服务器可能会遇到性能瓶颈。他需要处理大量的查询和响应服务器无法及时处理导致延迟或服务中断。侵犯版权问题Napster的设计使得它能够轻松地索引和共享受版权保护的内容这导致了侵犯版权的问题。 完全分散式 查询泛洪Gnutella Gnutella 网络的特点 全分布式 Gnutella网络没有中心服务器所有操作都是在用户之间直接进行的这种结构使得网络非常去中心化。开放文件共享协议 Gnutella是一个开放的协议许多Gnutella客户端实现了Gnutella协议类似HTTP有许多游览器。 Gnutella网络的工作原理 覆盖网络Overlay Network 如果两个节点之间有一个TCP连接那么在覆盖网络中这两个节点之间就有一条边。所有活动的节点和它们之间的边构成了覆盖网络。这些边并不是物理连接而是逻辑上的直接通信路径。通常一个节点会与少于10个其他节点建立连接。 协议的操作 查询节点通过已有的TCP连接发送查询报文来寻找文件。查询转发对等方转发查询报文使查询可以扩散到网络中更远的地方。查询命中当一个节点拥有查询中请求的文件时它会沿着查询来的相反路径返回一个查询命中报文包含文件的位置信息。文件传输当查询命中报文被接收后请求文件的节点可以直接通过HTTP协议从文件持有者那里下载文件。 对等方加入网络 新对等方X首先需要发现已经存在于Gnutella网络中的其他对等方使用可用对等方列表。 X自己维护一张对等方列表这个列表基于X之间的交互记录了那些经常在线的对等方。X可以联系维持列表的Gnutella站点从中获取对等方的信息。 X获取了对等方列表它会尝试与列表上的对等方建立TCP连接。X会依次尝试列表中的IP地址直到成功建立起至少一个TCP连接为止。这个连接通常是通过标准的网络握手过程建立的。 连接建立后X会想已建立连接的对等方Y发送一个Ping报文。 在Gnutella网络中所有收到Ping报文的对等方会回应一个Pong报文。 Pong报文会包含对等方的IP地址、它共享的文件数量以及文件的总字节数 X会从多个对等方接收到Pong报文通过这些Pong报文X利用这些网络信息与更多的对等方建立TCP连接。 由于每个查询都会被广播到多个对等方大量的查询可能会导致网络负担过重。为了防止网络被过度的查询流量淹没Gnutella协议使用了限制范围的洪泛查询。这意味着查询报文在网络中传播的距离是有限制的以减少网络的负担。 半分散式 KaZaA KaZaA网络它使用了一种称为“超级节点”Super Nodes或组长的结构来优化搜索和文件传输过程。 KaZaA网络的结构 对等方和组长超级结点 在KaZaA网络中每个对等方普通用户的计算机要么作为一个组长要么隶属于一个组长。组长是选择的或自愿的通常是因为它们拥有更好的网络连接和资源。每个对等方与其组长之间有TCP连接组长之间也相互有TCP连接。 内容跟踪和查询转发 组长负责跟踪所有子节点隶属的对等方的内容。当查询发生时组长将负责处理其子节点发出的查询并将这些查询转发到其他组长这样可以在网络中寻找到请求的文件。 KaZaA的查询过程 文件标识在KaZaA网络中每个文件都通过一个唯一标识的散列标识码来标识这个标识码是基于文件内容生成的确保了文件的唯一性。文件描述符则提供文件的元数据信息如文件名、类型、大小等。当用户想要搜索文件时他们的KaZaA客户端会向其所连接的组长发送一个包含搜索关键字的查询。这个查询包含用户希望查找的文件类型或名称的一部分。组长节点接收到查询请求后会在本地索引中查找匹配的文件。如果找到匹配项组长会将这些文件的元数据、散列标识码和存储该文件的对等方的IP地址作为查询相应发送会客户端。如果组长在本地没有找到匹配的文件它可能会将查询转发给其他组长结点。这些组长也会在自己的索引中查找匹配的文件并将找到的匹配以查询命中的形式响应给原始查询的组长。当客户端收到一个或多个查询命中响应后他将根据提供的信息选择想要下载的文件。然后客户端会向拥有该文件的对等方发送一个HTTP请求来下载文件。这个请求会包含文件的散列标识码以确保下载的是正确的文件。 KaZaA的一些机制 KaZaA网络使用了一些机制来提高文件共享的效率和鼓励用户参与。这些小技巧包括请求排队、激励优先权和并行下载。 请求排队 为了更有效地管理上载带宽并提供平等的服务给各个用户KaZaA实施了请求排队系统。这意味着如果多个用户想要从同一个节点上载同一个文件他们可能会被放入一个队列中。这个系统限制了同时进行的上载数量确保每个正在传输的文件都能从上载节点获得足够的带宽从而提高了文件传输的速度和效率。 激励优先权 KaZaA通过给予那些愿意分享文件的用户更高的下载优先权来激励用户上载文件。这种方法鼓励用户不仅下载文件也上传文件给其他用户。这个激励机制加强了系统的整体扩展性因为它促使用户贡献自己的资源从而增加了网络上可用的资源总量。 并行下载 KaZaA支持从多个对等方同时下载同一个文件的不同部分。这利用了HTTP协议的字节范围首部Byte Range Headers允许客户端请求文件的特定部分。通过并行下载用户可以同时从多个源接收数据这样可以更快地完成整个文件的下载。这不仅减少了对单一节点的依赖也提高了下载过程的鲁棒性。 DHTDistributed Hash Table分布式散列表 DHT是一种分布式存储系统它提供了一种键值对key-value pair存储的方法允许进行快速的查找操作。DHT在多个应用中非常有用尤其是在P2P网络中因为它能够在没有中心服务器的情况下高效地处理节点的加入和离开以及数据的存储和检索。 DHT的核心概念 键值对 在DHT中数据以键值对的形式存储。键Key是数据的唯一标识符而值Value则是与键相关联的数据内容可以是文件的位置、数据的内容或者是其它任何需要存储的信息。 哈希函数 DHT使用哈希函数来决定数据应当存储在网络中的哪个位置。哈希函数将键转换成一个固定长度的数字标识符该标识符通常是一个很大的整数。哈希函数需要具备一定的属性如均匀性确保数据能够均匀分布在所有节点上减少冲突以及不可逆性保护原始数据的安全。 节点 在DHT中每个参与的计算机或服务器被称为一个“节点”Node。每个节点负责存储一部分键值对这一部分由哈希函数计算得出。 数据分布 当一个键值对被添加到DHT时它会被存储在哈希值与之最接近的节点上。这意味着每个节点都会存储一个哈希值范围内的所有键值对。这种方法确保了即使某个节点不可用也可以从其他节点找到数据。 DHT的工作原理 查找过程 当需要查找一个键对应的值时发起查询的节点会根据哈希函数和键来确定应当查询的节点。然后它会向这个节点发起一个查询请求。如果这个节点拥有这个键的数据它就会返回相应的值如果没有则可能会将查询请求转发给其他可能有这个数据的节点。 维护和拓扑 为了保持网络的健康和高效DHT网络需要不断地进行维护。这包括处理节点的加入和退出、数据的复制和迁移、以及定期的健康检查等。 DHT的特点 可扩展性 DHT非常适合大规模的网络因为它能够在节点数目大幅增加时保持高效的性能。 容错性 DHT通过数据复制和其他机制来提高容错性。即使个别节点失败或离开网络整个网络仍然可以正常工作。 自我组织 DHT网络能够自动地处理节点的加入和退出无需人为干预。 DHT广泛应用于各种P2P系统比如文件共享服务BitTorrent的追踪器就是通过DHT来实现的。 结构化P2P和非结构化P2P 非结构化P2P 非结构化P2P这类网络没有固定的网络拓扑结构或严格的资源组织方式。节点以随机的方式连接文件和资源的分布也是随机的。 非结构化P2P包括 集中化目录Napster完全分散式Gnutella半分散式KaZaA 非结构化的特点是 节点连接随机通常使用洪泛搜索flooding来发现资源在网络规模增大效率降低网络对于结点的频繁加入和离开波动非常鲁棒因为没有固定的结构 结构化P2P 结构化P2P网络使用严格定义的拓扑结构和算法来组织资源和节点其中最著名的是分布式散列表DHT。 特点 网络拓扑网络有固定的、数学上定义好的拓扑结构如环形、树形或其他几何结构。资源定位每个资源通过其键的哈希值和节点都有确定的位置和责任资源查找可以快速且精确。可扩展性结构化P2P网络设计有很好的可扩展性能够高效地处理大规模网络。鲁棒性通过复制和其他机制即使在节点频繁变动的情况下也能保证数据的完整性和可用性。典型应用BitTorrent的DHT网络、IPFS星际文件系统。 优点 高效的搜索查询时间通常可以预测与网络大小对数相关。流量较少由于有目的性的路由网络流量更加高效。负载均衡网络负载相对均匀分布在所有节点上。 CDN 视频流化服务如Netflix和YouTube在现代互联网中占据了巨大的份额。这些服务器需要将大量数据传输给全球范围内的用户这就带来了一系列挑战尤其是在规模性和异构性方面。 规模性 单个服务器或数据中心无法处理如此巨大的用户基础和数据量。这主要是因为 带宽限制单个服务器的出站带宽是有限的无法支持数以亿计的用户同时请求数据。地理位置用户遍布全球单个地点的服务器无法提供低延迟的服务。故障和维护任何服务器或系统都可能出现故障一个集中式的系统更容易因为单点故障而导致服务中断。 异构性 用户设备的多样性用户使用不同的设备如智能手机、电脑以及不同类型的网络连接如有线、无线、移动数据。带宽的不一致性不同用户的网络速度和稳定性差异很大从高速宽带到受限的移动数据都有。 解决方案分布式的应用层面的基础设施。 多媒体视频 视频 概念由一系列固定速度显示的图像组成的序列。e.g.24images/sec 网络视频特点 高码率视频通常具有比音频高得多的网络带宽需求。视频通常可压缩减少所需带宽的同时保证质量。主导网络流量视频内容占据了网络流量的大部分超过90%。 数字化图像和编码 数字图像由像素Picture Elements的阵列组成每个像素使用若干个bits来表示其颜色和亮度。 编码通过利用图像内部和图像之间的冗余来减少所需的比特数从而实现压缩。 空间冗余图像内部像素之间的相似性比如大面积相同颜色的区域可以更高效地编码。时间冗余连续帧之间的相似性由于物体或场景变化较小可以只传输变化的部分而非每一帧的全部数据。 这里的冗余是指数据中那些不必要或者重复的信息这部分信息可以通过编码算法被去除或简化以减少文件大小。 空间编码例子如果一幅图像主要由同一颜色组成比如紫色那么不需要发送每个像素的颜色值。相反只需要发送颜色值一次和这个颜色重复的次数N。 时间编码例子当传输视频时如果连续两帧frame i 和 frame i1之间只有少量的变化那么就没有必要发送整个frame i1的数据。可以只发送从frame i到frame i1之间发生变化的部分。 下面是两种视频编码时考虑的比特率控制方法 CBR恒定比特率 预测性好由于比特率是固定的因此很容易预测视频文件的大小和网络带宽的需求。流媒体友好流媒体服务如直播通常优先选择CBR因为它保证了数据流的连贯性和稳定性减少了缓冲和延迟问题。 VBR可变比特率 与CBR不同VBR根据视频内容的复杂度动态调整比特率。VBR能够更加有效地利用带宽只在需要保持视频质量的时候增加比特率。VBR通常能提供比CBR更好的视频质量特别是在视频内容变化显著时。 存储视频的流化服务 存储视频的流化服务是指将视频文件保存在服务器上以便用户可以通过互联网按需进行流式播放的服务。这种服务允许用户随时随地观看内容不需要完整地下载整个视频文件。 多媒体流化服务DASH DASHDynamic Adaptive Streaming over HTTP是一种先进的多媒体流化技术也称为自适应流或自适应比特率流。它允许高质量的视频流通过普通的HTTP网络传输同时能动态适应用户的网络条件。 DASH的工作原理 视频文件处理 视频被切割成一系列较小的文件块每个块包含视频的一小部分。每个块都已多种不同的比特率独立编码通常有8-10种不同的质量级别以适应不同网络速度和用户需求。 告示文件Manifest file 告示文件是一种索引文件它描述了所有可用的视频块及其相关信息包括每个块的URL和每个质量级别的比特率。客户端首先下载这个告示文件以了解可用的视频质量选项和响应的快。 客户端操作 客户端在开始播放前获取告示文件并周期性地测量从服务器到客户端的带宽。根据当前的网络带宽客户端会决定请求哪一个质量级别的视频块。如果网络条件良好客户端会请求高比特率高质量的块如果网络条件差客户端则请求低比特率的块。客户端会智能地决定何时请求数据块以保持播放的连贯性并避免缓冲即视频暂停等待更多数据的情况。 DASH的优点 自适应性DASH允许视频播放质量根据实时网络条件自动调整从而提供尽可能好的观看体验。灵活性由于是基于HTTPDASH可以利用现有的网络基础设施如CDN以增加传输效率和可靠性。用户体验通过避免视频缓冲和提供最佳可用质量DASH改善了用户体验。 DASH的实施 客户端在播放视频时不断监控网络状况并动态请求最合适的视频块。这种“智能”客户端可以 确定何时请求新的数据块以避免缓存不足或溢出的情况。选择何种编码速率的视频块根据当前可用带宽请求相应质量的视频。决定从哪个服务器请求数据块通常是从最近的CDN节点或带宽较大的服务器获取。 Content Distribution Networks 内容分发网络 挑战服务器如何通过网络向上百万用户同时流化视频内容上百万视频内容 选择1mega-server单个超级服务中心 这种选择可能包括一下几个问题 服务器到客户端路径上跳点较多瓶颈链路的带宽小可能导致视频播放中断。网络中存在多个相同视频的副本导致低效的带宽利用和高运营的成本。存在单点故障风险和性能瓶颈。周边网络拥塞问题。 这种方法结构简单但不具备可拓展性难以适应不断增长的用户和数据需求。 选择2CDN 使用CDN技术在整个网络中部署多个缓存节点将内容存储得更靠近用户。 enter deep将CDN服务器深入到许多接入网 更接近用户数量多离用户近管理困难。 bring home在少数关键位置部署服务器簇。 通过在流量交换的核心位置部署服务器集群可以优化流量路由提高数据传输效率。 CDN的优化方式 内容复制CDN在不同地理位置的多个服务器上存储内容的副本。确保内容靠近用户减少延迟加快内容传输速度。重定向机制当用户请求内容视频时CDN会将请求重定向到最近或最合适的存有内容副本的服务器。缓存CDN节点会缓存内容当用户请求之前已经请求过的内容时CDN可以直接冲缓存中提供而不需要再次从源服务器获取。负载均衡CDN在多个服务器之间分配用户请求和流量防止任意单一服务器过载。 CDN 的工作原理 内容请求用户通过点击网站上的视频链接等方式发起内容请求。DNS解析用户设备联系域名系统DNS将站点的域名解析为IP地址。定位内容用户的请求被定向到合适的CDN节点。内容传递一旦确定了最近或最合适的CDN节点请求的内容就从这个节点传递到用户的设备。如果节点上没有内容CDN可能会从源服务器或父节点获取然后传递给用户。处理网络拥塞如果直接到内容的路径发生拥塞CDN有能力重新路由请求到较少拥塞的节点或通过替代路径。更新内容CDN定期从源服务器更新其缓存的内容确保用户接收到内容的最新版本。 Socket 编程 Socket编程是一种网络编程的方式它允许应用程序通过网络发送和接收数据。Sockets是应用层与TCP/IP协议族传输层之间的抽象层使得程序员可以不必处理协议的细节而进行网络通信。 在传输层服务中主要有两种socket类型 TCP可靠的、字节流的服务。UDP不可靠数据UDP数据报服务。 TCP套接字编程 TCP传输控制协议提供了一种可靠的服务确保从一个进程发送到另一个进程的数据能够按序、可靠地传输。 TCP套接字编程的过程 服务器设置 服务器进程必须首先启动并运行以便可以监听和接受客户端的连接请求。然后服务器创建一个套接字这个套接字仅用于接受新的连接请求通常被称为“欢迎套接字”。服务器将这个欢迎套接字与本地端口绑定这个客户端就知道向哪个端口发送连接请求。服务器在欢迎套接字上进行阻塞式等待即进入等到状态直到客户端发起连接请求。 客户端发起连接 客户端创建一个本地套接字操作系统会为其分配一个端口号自动的即“隐式绑定”。然后客户端指定要连接的服务器的IP地址和端口号。客户端会调用连接(connect)API请求与服务器的指定端口和IP地址建立TCP连接。 服务器接受连接 当客户端的连接请求到达服务器时服务器接受请求解除阻塞状态并返回一个新的套接字。这个新套接字专门用于与请求的客户端进行通信。通过返回新的套接字服务器可以继续在欢迎套接字上监听其他的连接请求允许它与多个客户端同时通信。同时服务器可以使用源IP地址和源端口号来区分不同的客户端。 TCP连接建立 当连接请求被接受客户端和服务器之间建立了一个TCP连接这时客户端的套接字和服务器的新套接字已经连接可以开始数据交换。 数据传输 一旦TCP连接建立客户端和服务器之间就形成了一条可靠的通信“管道”。双方可以通过这条管道按需发送字节流无需担心数据的顺序、可靠性问题。 数据传输完成后客户端和服务器将关闭他们的套接字并释放资源。 下面介绍两个在网络编程中常用的数据结构sockaddr_in 和 hostent。他们应用于进行地址和端口的配置以及域名解析。 sockadd_in sockaddr_in 是一个用于存储地址和端口的数据结构在IPv4通信中非常重要。下面是该数据结构每个字段的说明。 short sin_family地址族。u_short sin_port端口号。struct in_addr sin_addrIP地址。这是一个结构体它包含了一个无符号长整型的字段用于存储网络接口的IPv4地址。char sin_zero[8]填充字段确保sockaddr_in的总长度与sockaddr结构相同。这个字段不用于网络通信只是为了保持内存对齐通常设置为0。 hostent hostent 结构用于保存域名解析函数的返回信息它在域名到IP地址的转换过程中使用 char *h_name官方的主机名。char **h_aliases主机的别名列表是一个以NULL结尾的数组。int h_addrtype地址类型通常是 AF_INET。int h_length地址的长度对于IPv4来说通常是4字节。char **h_addr_listIP地址列表是一个以NULL结尾的数组。对于IPv4每个地址是一个4字节的数。h_addr是h_addr_list的第一个地址的别名用于历史兼容。 当使用如gethostbyname()这样的函数时如果您查询的是主机名它会返回一个指向hostent结构的指针。然后您可以取出h_addr_list中的第一个地址h_addr并将其复制到sockaddr_in结构的sin_addr字段中以用于创建网络连接。 例子C客户端TCP #include stdio.h #include stdlib.h // 标准库用于 atoi 函数 #include string.h #include unistd.h #include sys/socket.h #include netinet/in.h // Internet地址族 #include netdb.h // 网络数据库操作int main(int argc, char *argv[]) {struct sockaddr_in sad; // 用来保存服务器IP地址的结构int clientSocket; // 套接字描述符struct hostent *ptrh; // 指向主机表条目的指针char Sentence[128]; // 发送数据的缓冲区char modifiedSentence[128]; // 接收数据的缓冲区int port; // 端口号char *host; // 主机名指针if (argc ! 3) {fprintf(stderr, Usage: %s Server IP Server Port\n, argv[0]);exit(1);}host argv[1];port atoi(argv[2]);// Create a socketclientSocket socket(PF_INET, SOCK_STREAM, 0);if (clientSocket 0) {fprintf(stderr, Error: Socket creation failed.\n);exit(1);}// Clear sockaddr structurememset((char *)sad, 0, sizeof(sad)); sad.sin_family AF_INET; // Set family to Internetsad.sin_port htons((u_short)port); // Set port number// Convert host name to equivalent IP address and copy to sadptrh gethostbyname(host);if (ptrh NULL) {fprintf(stderr, Error: Invalid host name.\n);close(clientSocket);exit(1);}memcpy(sad.sin_addr, ptrh-h_addr, ptrh-h_length);// Connect the socket to the specified serverif (connect(clientSocket, (struct sockaddr *)sad, sizeof(sad)) 0) {fprintf(stderr, Error: Connection failed.\n);close(clientSocket);exit(1);}// Read a sentence from the userprintf(Enter a line of text:\n);fgets(Sentence, sizeof(Sentence), stdin);// Send the line to the serverif (write(clientSocket, Sentence, strlen(Sentence) 1) 0) {fprintf(stderr, Error: Failed to send data.\n);close(clientSocket);exit(1);}// Read the servers replyif (read(clientSocket, modifiedSentence, sizeof(modifiedSentence)) 0) {fprintf(stderr, Error: Failed to receive data.\n);close(clientSocket);exit(1);}// Output the modified sentenceprintf(FROM SERVER: %s\n, modifiedSentence);// Close the connectionclose(clientSocket);return 0; }C服务器TCP #include stdio.h // 标准输入输出定义 #include stdlib.h // 标准库用于 atoi 函数 #include string.h // 内存操作 #include unistd.h // UNIX标准函数定义 #include sys/socket.h // 套接字主要头文件 #include netinet/in.h // Internet地址族 #include netdb.h // 网络数据库操作void capitalizeSentence(char *str); // 假设此函数定义为将字符串转换为大写int main(int argc, char *argv[]) {struct sockaddr_in sad; // 结构体保存服务器的IP地址struct sockaddr_in cad; // 结构体保存客户端地址int welcomeSocket, connectionSocket; // 套接字描述符socklen_t alen; // 地址长度char clientSentence[128]; // 客户端发送的句子char capitalizedSentence[128]; // 服务器将要发送回去的句子int port; // 端口号if (argc ! 2) {fprintf(stderr, Usage: %s Server Port\n, argv[0]);exit(1);}port atoi(argv[1]);// 创建套接字welcomeSocket socket(PF_INET, SOCK_STREAM, 0);if (welcomeSocket 0) {fprintf(stderr, Error: Socket creation failed.\n);exit(1);}// 清零 sockaddr 结构memset((char *)sad, 0, sizeof(sad));sad.sin_family AF_INET; // 设置地址族为Internetsad.sin_addr.s_addr INADDR_ANY; // 设置本地IP地址sad.sin_port htons((u_short)port); // 设置端口号// 绑定套接字if (bind(welcomeSocket, (struct sockaddr *)sad, sizeof(sad)) 0) {fprintf(stderr, Error: Binding failed.\n);close(welcomeSocket);exit(1);}// 监听套接字if (listen(welcomeSocket, 10) 0) { // 10是最大客户端排队数fprintf(stderr, Error: Listening failed.\n);close(welcomeSocket);exit(1);}// 服务器主循环while(1) {alen sizeof(cad);// 接受连接connectionSocket accept(welcomeSocket, (struct sockaddr *)cad, alen);if (connectionSocket 0) {fprintf(stderr, Error: Accept failed.\n);continue;}// 读取客户端句子if (read(connectionSocket, clientSentence, sizeof(clientSentence)) 0) {fprintf(stderr, Error: Reading from socket failed.\n);close(connectionSocket);continue;}// 转换句子为大写capitalizeSentence(clientSentence);strcpy(capitalizedSentence, clientSentence); // 假设转换已完成// 发送转换后的句子回客户端if (write(connectionSocket, capitalizedSentence, strlen(capitalizedSentence)1) 0) {fprintf(stderr, Error: Writing to socket failed.\n);}// 关闭连接close(connectionSocket);}// 关闭欢迎套接字close(welcomeSocket);return 0; }// 假设capitalizeSentence函数的实现 void capitalizeSentence(char *str) {// 逻辑实现将str中的每个字符转换为大写 }UDP套接字编程 UDP在客户端和服务器之间没有连接不进行握手。 发送端需要再每个UDP数据报中指定接收方的IP地址和端口号服务器接收到数据报后必须从该数据报中提取发送端的IP地址和端口号。 UDP数据报可能丢失或乱序没有内建的重传和顺序控制机制。 进程视角看UDP服务 UDP为客户端和服务器提供不可靠的字节组的传送服务。 UDP的客户端和服务器之间的套接字交互过程较为简单因为它不需要建立和维护一个连接。下面是详细的交互过程 客户端 创建UDP套接字 客户端通过调用socket()函数创建一个数据报套接字指定PF_INET作为协议族和SOCK_DGRAM作为套接字类型。 int clientSocket socket(PF_INET, SOCK_DGRAM, 0);构造服务器地址 客户端需要知道服务器的IP地址和端口号因此它将这些信息填入一个sockaddr_in结构体中。使用函数inet_pton()来将点分十进制的IP地址转换为网络字节顺序的二进制形式端口号则用htons()转换为网络字节顺序。 发送数据 使用sendto()函数客户端将数据发送到指定的服务器地址和端口号。在sendto()调用中客户端必须提供包含服务器地址的sockaddr_in结构体以及该结构体的大小。 sendto(clientSocket, message, messageLength, 0, (struct sockaddr *)serverAddr, sizeof(serverAddr));接受相应 客户端可以选择性地使用recvfrom()函数等待并接收服务器的响应。这个函数也会返回发送端的地址信息客户端可以使用这些信息来验证响应的来源。 recvfrom(clientSocket, buffer, bufferLength, 0, (struct sockaddr *)fromAddr, addrLength);关闭套接字 通信完成后客户端关闭套接字释放资源。 close(clientSocket);客户端交互的完整代码 #include stdio.h #include stdlib.h #include string.h #include unistd.h #include sys/socket.h #include netinet/in.h #include arpa/inet.h#define SERVER_PORT 9876 // 服务器的端口号 #define SERVER_IP 127.0.0.1 // 服务器的IP地址 #define MAXLINE 1024int main(int argc, char *argv[]) {int sockfd;struct sockaddr_in serveraddr;char sendline[MAXLINE], recvline[MAXLINE];int n;// 创建UDP套接字sockfd socket(AF_INET, SOCK_DGRAM, 0);// 设置服务器地址memset(serveraddr, 0, sizeof(serveraddr));serveraddr.sin_family AF_INET;serveraddr.sin_addr.s_addr inet_addr(SERVER_IP);serveraddr.sin_port htons(SERVER_PORT);while (fgets(sendline, MAXLINE, stdin) ! NULL) {// 发送数据到服务器sendto(sockfd, sendline, strlen(sendline), 0, (struct sockaddr *) serveraddr, sizeof(serveraddr));// 从服务器接收响应n recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);recvline[n] 0; // null terminatefputs(recvline, stdout);}// 关闭套接字close(sockfd);return 0; }服务器 创建UDP套接字 类似于客户端服务器也通过调用socket()函数来创建一个UDP套接字。 绑定套接字 服务器使用bind()函数将其套接字绑定到一个地址和端口上这样它就可以在该端口上接收到达的数据报。 bind(serverSocket, (struct sockaddr *)serverAddr, sizeof(serverAddr));等待数据 服务器使用recvfrom()函数等待来自客户端的数据。当数据报到达时recvfrom()会填充一个sockaddr_in结构体其中包含了发送端的地址信息。 recvfrom(serverSocket, buffer, bufferLength, 0, (struct sockaddr *)clientAddr, addrLength);发送响应 服务器处理接收到的数据后可以使用sendto()函数发送响应回客户端。在sendto()调用中服务器提供客户端的地址信息以确保响应能被发送到正确的目的地。 sendto(serverSocket, response, responseLength, 0, (struct sockaddr *)clientAddr, sizeof(clientAddr));服务器交互的完整代码 #include stdio.h #include stdlib.h #include string.h #include unistd.h #include sys/socket.h #include netinet/in.h#define SERVER_PORT 9876 // 服务器的端口号 #define MAXLINE 1024int main(int argc, char *argv[]) {int sockfd;struct sockaddr_in serveraddr, clientaddr;char msg[MAXLINE];socklen_t clientlen;int n;// 创建UDP套接字sockfd socket(AF_INET, SOCK_DGRAM, 0);// 设置服务器地址memset(serveraddr, 0, sizeof(serveraddr));serveraddr.sin_family AF_INET;serveraddr.sin_addr.s_addr htonl(INADDR_ANY);serveraddr.sin_port htons(SERVER_PORT);// 绑定套接字到地址bind(sockfd, (struct sockaddr *) serveraddr, sizeof(serveraddr));while (1) {clientlen sizeof(clientaddr);// 接收来自客户端的数据n recvfrom(sockfd, msg, MAXLINE, 0, (struct sockaddr *) clientaddr, clientlen);msg[n] 0; // null terminateprintf(Received: %s, msg);// 将接收到的消息发送回客户端sendto(sockfd, msg, n, 0, (struct sockaddr *) clientaddr, clientlen);}// 关闭套接字理论上服务器是不会停止的但这是一个好习惯close(sockfd);return 0; }在这整个交互过程中UDP协议不保证数据包的顺序、可靠传输或是数据包不重复。因此任何必要的可靠性措施如确认回执、重传机制等都需要在应用层实现。UDP的优势在于它的轻量级和低延迟特性非常适合那些对时效性要求高的应用如视频会议或在线游戏。
http://www.w-s-a.com/news/949581/

相关文章:

  • 桂林网站建设桂林网站的元素有哪些
  • 广东网站开发推荐网页制作个人简历模板教程
  • e建网保定百度seo公司
  • 网站建设中html代码网络培训课堂app
  • 无锡做网站seo自己做的网站如何上传网上
  • 园林景观网站模板小白怎么做跨境电商
  • 找第三方做网站 需要注意企业网站带数据库
  • 北京南站到北京站flash网站制作单选框和复选框ui组件
  • 网站建设核电集团网站设计案例
  • 宝塔做的网站能不能访问上海的广告公司网站建设
  • 网站会员系统方案新能源网站建设哪家好
  • 全球网站域名域名被墙查询
  • 做期货看资讯什么网站好哈尔滨网站设计联系方式
  • 建站宝盒免费下载上海网论坛网址
  • 国内最有趣的25个网站推广流程
  • 红河做网站抖音小程序怎么挂到抖音上
  • 高度重视机关门户网站建设外包
  • 网站里面送礼物要钱怎么做代码网站开发怎么对接客户
  • 泰州网站制作策划如何做网站需求
  • 门户网站优化报价软件技术公司
  • 怎样换网站logo公司名字大全集免费
  • 为网站网站做推广各类最牛网站建设
  • 网站用自己的电脑做服务器佛山做网站制作公司
  • 一个网站如何做cdn加速器如何上传网站数据库
  • 汝州住房和城乡建设局新网站营销网站定位
  • yy直播官网seo引擎优化是什
  • 做影视网站违法莫品牌营销是什么
  • 全网最稳最低价自助下单网站wordpress电影网站主题
  • 域名更换网站温州建设工程网站
  • 网站如何优化推广连锁店管理网站开发