深入理解计算机系统——第十一章 Network Programming

news2024/11/28 22:36:42

深入理解计算机系统——第十一章 Network Programming

  • 11.1 The Client-Server Programming Model
  • 11.2 Networks
  • 11.3 The Global IP Internet
    • 11.3.1 IP Addresses
    • 11.3.2 Internet Domain Names
    • 11.3.3 Internet Connections
  • 11.4 The Sockets Interface
    • 11.4.1 Socket Address Structures
    • 11.4.2 The socket Function
    • 11.4.3 The connect Function
    • 11.4.4 The bind Function
    • 11.4.5 The listen Function
    • 11.4.6 The accept Function
    • 11.4.7 Host and Service Conversion
      • The getaddrinfo Function
      • The getnameinfo Function
  • 11.5 Web Servers
    • 11.5.1 Web Basics
    • 11.5.2 Web Content
    • 11.5.3 HTTP Transactions
    • 11.5.4 Serving Dynamic Content

资源:

视频课程
视频课件 1
视频课件 2
解读《深入理解计算机系统(CSAPP)》第11章网络编程
深入理解计算机系统 第11章 笔记整理
[读书笔记]CSAPP:25[VB]网络编程1
IP地址和MAC地址的区别和联系是什么?

11.1 The Client-Server Programming Model

每个网络应用都是依据客户端-服务器模型,一个应用由一个服务器进程和一个或多个客户端进程组成。

一个服务器管理某种资源,并通过操作这种资源客户端提供某种服务

客户端-服务器模型的基本操作是事务(transaction),由下面四步组成:

  1. 客户端需要服务时,通过向服务器发送请求来初始化一个事务。
  2. 服务器接收到请求后,解释(interpret)它,然后以合适的方式操作其资源。
  3. 服务器向客户端发送响应(response),然后等待下一个请求。
  4. 客户端接收响应并进行处理。

fig 11.1

注意:客户端和服务器是进程而不是机器。

11.2 Networks

客户端和服务器通常运行在分开的主机(host)上,通过计算机网络(computer network)的硬件和软件资源来交流。

对于主机而言,网络就是一种 I/O 设备,充当数据源和数据接收方。

fig 11.2


  • 从上图可以看出,适配器(adapter)是插在 I/O 总线的扩展插槽(expansion slots)中,为网络(network)提供物理接口。
  • 从网络接收的数据经过网络适配器,I/O 总线和内存总线最终复制到主存中,即通过 DMA 传输方式(见 6.1.1 节)。
  • 数据也能从内存复制到网络。

物理层面上说,网络是依据地理远近组成的层次系统(hierarchical system):

network


以太网段(Ethernet segment):

  • 以太网段由一些电缆(通常为双绞线(twisted pairs of wires))和一个被称为集线器(hub)的小盒子组成,见下图所示:
    fig 11.3
  • 以太网段通常覆盖的面积的范围很小,如一个房间或一栋建筑的一层。
  • 每个电缆有相同大小的带宽(bandwidth),通常为 100 Mb/s 或 1 Gb/s。
  • 电缆的一端连接到一个主机的适配器上,另一端连到集线器的一个端口上。
  • 集线器会将每个端口接收到的数据复制其他的所有端口,因此与集线器相连的每个主机能看到集线器上传输的所有数据。
  • 每个以太网适配器有一个全球唯一的 48 位地址(MAC address),该地址存在适配器非易失性存储器上。
  • A host can send a chunk of bits called a frame to any other host on the segment.
    • Each frame includes some fixed number of header bits that identify the source and destination of the frame and the frame length, followed by a payload of data bits.
    • Every host adapter sees the frame, but only the destination host actually reads it.

桥接以太网段(Bridged Ethernet Segment)
fig 11.4

  • 通过一些电缆和被称为网桥(bridges)的小盒子,多个以太网段能连接成更大的局域网(LAN),称为桥接以太网(bridged Ethernets)。
  • 桥接以太网能覆盖更大的范围,如一栋建筑或学校。
  • 网桥集线器能更好的利用带宽,它不会无差别的复制数据给所有的集线器,而是通过自学习后有选择的复制数据到对应的端口。例如主机 A 发送帧给主机 B,则网桥 X 会丢掉该帧的数据;如果主机 A 发送帧给主机 C,则网桥 X 复制帧给网桥 Y,然后网桥 Y 只会将帧复制给主机 C 所在的集线器端口。

互联网络(internet):
fig 11.6

  • 多个不兼容的局域网可以通过一种被称为路由器(router)的计算机连接起来形成互联网络(internet)
  • 每个路由器对于它所连接的每个网络都有一个适配器(端口)。
  • 路由器也能连接高速点到点电话连接,这种是一种被称为广域网(wide area networks)的例子。

注意
Internet versus internet

The crucial property of an internet is that it can consist of different LANs and WANs with radically different and incompatible technologies.


协议软件(protocol software): 协议软件运行在每个主机路由器上,通过一种协议(protocol)来处理不同网络之间的差异

协议(protocol): 一系列规则,用来管理不同的主机路由器网络之间如何传输数据

  • Provides a naming scheme
    • An internet protocol defines a uniform format for host addresses.
    • Each host (router) is then assigned at least one of these internet addresses that uniquely identifies it.
  • Provides a delivery mechanism
    • An internet protocol defines a standard transfer unit (packet).
    • Packet consists of header and payload.
      • Header: contains info such as packet size, source and destination address.
      • Payload: contains data bits sent from source host.

下图 11.7 展示主机和路由器怎么通过互联网协议在不兼容的局域网之间传输数据:
fig 11.7

运行在主机 A 的客户端连接的是局域网 LAN1,需要给连接在局域网 LAN2 上的主机 B 的服务器发送数据,该过程如下:

  1. 主机 A 上的客户端通过系统调用从客户端的虚拟地址空间复制数据到内核的缓冲区。
  2. 主机 A 上的协议软件数据添加一个 internet header(PH)和 LAN1 帧头(LAN1 frame header)从而组成一个 LAN1 frame,再将该 LAN1 frame 传输给 LAN1 适配器(adapter)
    • internet header 记录主机 B 的 IP 地址,LAN1 frame header 记录路由器的 MAC 地址。
    • LAN1 framepayload 就是一个 internet packet,而该 internet packerpayload 是实际传输的数据 data
  3. LAN1 适配器将该帧复制到网络上。
  4. 到达路由器时,路由器的 LAN1 适配器读该帧的数据然后传送给 protocol software
  5. 路由器根据中的 internet packet header (PH) 中获取 destination internet address(主机 B 的 IP 地址),然后将其作为路由表(routing table)的索引来决定将这个包(packet)转发到哪个端口,此例中为 LAN2。路由器去掉旧的帧头 FH1,然后添加新的帧头 FH2,该帧头记录主机 B 的 MAC 地址,然后将该帧传递给 LAN2 适配器。
  6. 路由器的 LAN2 适配器将帧复制到网络。
  7. 当帧达到主机 B后,主机 B的适配器读取该帧数据然后传送给协议软件。
  8. 主机 B的协议软件剥离帧头 FH2 和包头 PH2,当服务器有读这些数据的系统调用时,协议软件将最终的数据复制到服务器的虚拟地址空间。

11.3 The Global IP Internet

Figure 11.8 shows the basic hardware and software organization of an Internet client-server application.

fig 11.8

11.3.1 IP Addresses

  1. IP 地址是无符号 32 位整数。

  2. TCP/IP 定义了统一的网络字节序,对于 IP 地址等整型数据采用大端字节序。

  3. IP 地址通常用点分十进制(dotted-decimal notation)表示,如 128.2.194.242。

  4. IP 地址的结构如下:
    fig 11.9

  5. 主机字节序和网络字节序之间的转换如下:
    1

  6. IP 地址点分十进制字符串和二进制网络字节序之间转换函数:
    在这里插入图片描述
    函数名 _ 后面的 n 表示 networkp 表示 presentation,这两个函数能操作 32 位的 IPv4 地址(AF_INET)或者 128 位的 IPv6 地址(AF_INET6)。
    inet_pton 将点分十进制的字符串(src)转换为二进制的网络字节序(dst)。
    inet_ntop 将二进制的网络字节序(src)转换为点分十进制的字符串(dst)。

11.3.2 Internet Domain Names

互联网定义便于记忆的域名(domain name)来代替难记忆的 IP 地址,并通过域名系统 DNS(domain name system)来管理域名和 IP 地址之间的映射,DNS 是一个分布式的数据库系统

域名采用层次树状结构来命名,不区分大小写,其结构如下:

在这里插入图片描述

每个主机都有一个本地定义的域名 localhost,总是映射为回送地址(lookback address)127.0.0.1。

11.3.3 Internet Connections

Internet clients and servers communicate by sending and receiving streams of bytes over connections. Each connection is:

  • Point-to-point
    连接一对进程。
  • Full-duplex
    全双工模式,数据可以同时双向流动,同时发送和接收数据。
  • Reliable
    源进程发送的数据基本能以被目的进程按照相同的字节序接收。

连接的末端就是套接字(socket)。

  • 套接字的地址格式为:IP 地址 : 端口。(端口见 计算机网络-谢希仁-第7版 第5章 运输层 5.09)
  • 连接由其两端的套接字地址唯一的确定,这一对套接字称为套接字对(socket pair),格式为 (cliaddr:cliport, servaddr:servport)cliaddr 为客户端 IP 地址。
    fig 11.11

11.4 The Sockets Interface

The sockets interface is a set of functions that are used in conjunction with the Unix I/O functions to build network applications.

fig 11.12

11.4.1 Socket Address Structures

套接字:

  1. 从不同角度看套接字
  • 对于内核,套接字是通信的端点
  • 对于应用程序,套接字是一个有相应描述符的打开文件。
  1. 客户端和服务器通过读写套接字描述符来通信
    在这里插入图片描述
  2. 套接字和普通的 I/O 文件的区别
    The main distinction between regular file I/O and socket I/O is how the application “open” the socket descriptors.

套接字地址结构:

  • Generic socket address
    总共 16 字节,前两字节指明协议类型。
    在这里插入图片描述
    在这里插入图片描述

  • IP socket address structure
    总共 16 字节,前 2 字节协议类型为 AF_INET,表示使用 IPV4 协议;sin_port 占两个字节,表示端口号,大端字节序sin_addr 占 4 字节,表示 IP 地址;最后的 8 个字节用来填充。
    sockadd_in 可以看成 sock_addr 的子类。
    在这里插入图片描述
    在这里插入图片描述

  • IP 地址端口号在网络中都是大端字节序

11.4.2 The socket Function

Clients and servers use the socket function to create a socket descriptor.

在这里插入图片描述

clientfd = Socket(AF_INET, SOCK_STREAM, 0);
  • AF_INET 表名使用 32 位 IP 地址。
  • SOCK_STREAM 表名套接字将是连接的端点。
  • 返回的 clientfd 描述符还不能用来读写。

11.4.3 The connect Function

客户端通过 connect 函数和服务器建立连接。

在这里插入图片描述

  • addr 为服务器套接字地址。
  • addrlensizeof(sockaddr_in)
  • 该函数会阻塞直到连接成功或出错。
  • 如果连接建立成功,clientfd 则可以进行读写。
  • 连接成功,则返回值为套接字对:(x:y, addr.sin_addr:addr.sin_port),其中 x 为客户端 IP 地址,y 为客户端的短暂端口号。

11.4.4 The bind Function

The remaining sockets functions—bind, listen, and accept—are used by servers to establish connections with clients.

在这里插入图片描述

  • bind 函数要求内核将服务器的套接字地址 add 和套接字描述符 sockfd 关联起来。
  • addrlensizeof(sockaddr_in)

11.4.5 The listen Function

默认情况下,内核认为由 socket 函数创建的描述符为主动套接字(active socket),将作为客户端的套接字。

服务器可以调用 listen 函数来通知内核该描述符将被服务器使用。

在这里插入图片描述

  • listen 函数将 sockfd主动套接字转换为监听套接字(listening socket),用来接收客户端发送的连接请求。
  • The backlog argument is a hint about the number of outstanding connection requests that the kernel should queue up before it starts to refuse requests.

11.4.6 The accept Function

服务器通过调用 accept 函数来等待客户端连接请求。

在这里插入图片描述

accept 函数等待来自客户端连接请求到达监听描述符 listenfd,然后将客户端的套接字地址填写到 addr 中,最后返回一个已连接的描述符用来和客户端通信。

监听描述符连接描述符的区别:

  • 监听描述符客户端请求连接的末端。
  • 监听描述符创建一次,存在于服务器的整个生命周期
  • 连接描述符客户端服务器创建的连接的末端。
  • 连接描述符在每次服务器接收一个连接请求创建,只在服务器客户端提供服务的过程中存在。

监听和连接描述符的关系见下图:

在这里插入图片描述

  1. 服务器调用 accept 函数来等待连接请求到达监听描述符。
  2. 客户端调用 connect 函数,向 listenfd 发送连接请求。
  3. 服务器调用 accecpt 函数打开一个新的已连接的描述符 connfd ,在 clientfdconnfd 之间创建连接,返回 connfd 给应用程序。客户端和服务器能通信。

11.4.7 Host and Service Conversion

Linux provides some powerful functions, called getaddrinfo and getnameinfo, for converting back and forth between binary socket address structures and the string representations of hostnames, host addresses, service names, and port numbers.

The getaddrinfo Function

The getaddrinfo function converts string representations of hostnames, host addresses, service names, and port numbers into socket address structures.


1


  1. host 参数是域名或者数字形式的地址(如点分十进制的 IP 地址),可以为空 NULL。
  2. service 参数是十进制的端口号或者服务名(如 http 协议),可以为空 NULL。
  3. hostservice 不能同时为空 NULL。
  4. hint 是可选参数,是一个指向 addrinfo 结构体的指针,结构体如下,通常使用时,通过 memset 先将整个结构体清空,然后设置几个选择的字段。:
    fig 11.16
  5. Given host and service (the two components of a socket address), getaddrinfo returns a result that points to a linked list of addrinfo structures, each of which points to a socket address structure that corresponds to host and service.
    Clients: walk this list, trying each socket address in turn, untill the calls to socket and connect succeed.
    Servers: walk the list untill calls to socket and bind succeed.
    fig 11.5
  6. By default, getaddrinfo can return both IPv4 and IPv6 socket addresses. Setting ai_family to AF_INET restricts the list to IPv4 addresses. Setting it to AF_INET6 restricts the list to IPv6 addresses.
  7. Helper functions:
  • freeadderinfo frees the entire linked list.
  • gai_strerror converts error code to an error message.

The getnameinfo Function

The getnameinfo function is the inverse of getaddrinfo. It converts a socket address structure to the corresponding host and service name strings.

  • It is the modern replacement for the obsolete gethostbyaddr and getservbyport functions.
  • Unlike those functions, it is reentrant and protocol-independent.

1

示例:

fig 11.7

11.5 Web Servers

11.5.1 Web Basics

  • Web clients and servers interact using a text-based application-level protocol known as HTTP (hypertext transfer protocol).
  • Web content can be written in a language known as HTML (hypertext markup language).

1

11.5.2 Web Content

  1. To Web clients and servers, content is a sequence of bytes with an associated MIME (multipurpose internet mail extensions) type.
    11.23

  2. Web servers provide content to clients in two different ways:
    2

  3. Every piece of content returned by a Web server is associated with some file that it manages. Each of these files has a unique name known as a URL (universal resource locator).

    • Clients and servers use different parts of the URL during a transaction.
      3

    • URLs for executable files can include program arguments after the filename.
      A ‘?’ character separates the filename from the arguments, and each argument is separated by an ‘&’ character.
      For example, the URL http://bluefish.ics.cs.cmu.edu:8000/cgi-bin/adder?15000&213 identifies an executable called /cgi-bin/adder that will be called with two argument strings: 15000 and 213.

11.5.3 HTTP Transactions

  1. HTTP Requests
    An HTTP request consists of a request line, followed by zero or more request headers, followed by an empty text line that terminates the list of headers.
  • Request line
    • Method
      1
    • URI
      uri和url的区别与联系
      2
    • Version
      HTTP 版本,HTTP/1.0 或 HTTP/1.1。
  • request headers

计算机网络 谢希仁 第7版

3
4

  1. HTTP Responses
    An HTTP response consists of a response line, followed by zero or more response headers, followed by an empty line that terminates the headers, followed by the response body.
  • Response line

    • Version
      HTTP 版本。

    • Status-code
      5

    • Status-message
      状态码的文字描述。
      6

  • Response headers
    7

11.5.4 Serving Dynamic Content

见书和课件。

CGI 介绍:
8

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/85382.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目要求移动端适配和 分段视觉映射在ECharts框架里的运用【高级ECharts技术】

移动端适配 满足多个查询时的优先级: 请注意,可以同时满足多个查询,并且它们都将由mergeOption合并,mergeOption稍后由merge定义(即更高的优先级)。 默认查询: 如果媒体中有一项不写入查询,则表示“默认值”。也就是说,如果不符合所有规则,则采用此选项。 容器尺寸实…

web前端期末大作业:基于HTML+CSS+JavaScript奥迪企业bootstrap响应式网站

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

在 VMware Workstation 中安装 ESXi 7.x

安装 VMware ESXi 7.x 在 VMware 中安装 VMware ESXi配置 ESXi 客户机网络本文介绍如何在虚拟机中安装 VMware ESXi。在虚拟机中安装ESXi提供了一种无需专用硬件即可尝试该产品的方法。 在 VMware 中安装 VMware ESXi 从 VMware 下载中心下载 ESXi 7.x ISO映像注意:如果有选择…

Java基础之SPI机制

Java基础之SPI机制一、SPI机制的简单示例1、案例分层2、接口3、实现类4、测试类5、结果二、SPI机制的缺陷一、SPI机制的简单示例 1、案例分层 resources 接下来可以在resources下新建META-INF/services/目录,然后新建接口全限定名的文件:com.example.d…

.net开发安卓入门 -记录两个问题处理办法

文章目录问题1、 Could not find 3 Android X assemblies, make sure to install the following NuGet packages解决办法1:解决办法2:问题2、Java.Lang.IllegalArgumentException: com.lhd. iml6yu: Targeting S (version 31 and above) requires that o…

计算机毕业设计 基于HTML+CSS+JavaScript响应式网站健身7页,适配手机端,响应式页面,页面精美,使用bootstrap 框架

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

PEMN~

搬来个来自美国东大的哦~~ 为了处理更复杂的任务,近年来神经网络的规模也在不断变大,如何高效的储存和传输神经网络变得十分重要。另一方面,随着彩票假说(Lottery Ticket Hypothesis (LTH))的提出,随机稀疏…

基于java+springboot+mybatis+vue+mysql的私人健身与教练预约管理系统

项目介绍 21世纪,我国就已普及互联网信息,互联网对人们生活中带来了无限的便利。像大部分机构都在开发自己的管理系统,由传统的管理模式向互联网发展,如今开发自己的系统是时代发展的必然产物。那么开发私人健身与教练预约管理系…

[附源码]Python计算机毕业设计电影票购票系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等…

微服务框架 SpringCloud微服务架构 分布式事务 38 动手实践 38.9 Saga 模式

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 分布式事务 文章目录微服务框架分布式事务38 动手实践38.9 Saga 模式38.9.1 Saga 模式38.9.2 四种模式对比38 动手实践 38.9 Saga 模式 38…

删除压缩包密码

压缩包设置了加密,需要输入压缩包密码才能够顺利解压文件出来。但是有些时候,一些文件只需要一段时间内要加密,之后文件不需要加密了,每次解压文件的时候还是需要输入压缩包密码才行,就很麻烦,那么RAR压缩包…

快速搭建 单体SpringCloudAlibaba 微服务

本章主要讲述快速构建一套springcloud alibaba微服务,一切从简 nacos官网 https://nacos.io/zh-cn/docs/quick-start.html 1.下载启动nacos注册中心 Git地址 https://github.com/alibaba/nacos/releases 1.1 nacos自带默认数据库 derby,集群情况下持久…

JVM(内存划分+类加载+GC)

目录 🐲 1. JVM 内存划分 🐲 2. JVM 类加载 🦄 2.1 类型加载是干啥的 🦄 2.2 类加载的简略流程 🦄 2.3 什么时候会进行类加载 🦄 2.4 双亲委派模型 🐲 3. GC 垃圾回收机制 &…

图像的OTSU阈值化、双阈值化、半阈值化的原理及OpenCV代码实现

本文的基础是OpenCV的函数threshold(),关于函数threshold()的详细介绍,大家可以参考下面这篇博文: https://www.hhai.cc/thread-162-1-1.html 一、图像的OTSU阈值化 在阈值化处理中,OTSU是一种常用的算法,中文译为大津…

JavaEE-多线程初阶2

✏️作者:银河罐头 📋系列专栏:JavaEE 🌲“种一棵树最好的时间是十年前,其次是现在” 目录Thread类及常见方法获取当前线程引用休眠当前线程线程的状态线程的所有状态线程状态多线程的意义多线程带来的的风险-线程安全…

Python课程设计题目

文章目录1.基于Python的XX管理系统。2.基于Python的XX工具开发1.基于Python的XX管理系统。 实例要求:采用面向对象或是字典保存实例的属性信息。 功能要求:提供增加,删除,修改,单个查询,查询所有&#xff…

NFC标签 “ PN29_S

产品参数产品参数 产品型号 PN29_S 产品尺寸 (mm) 9546.45.4 显示技术 E ink 显示区域 (mm) 29(H)66.9(V) 分辨率 (像素) 296128 像素尺寸(mm) 0.2270.226 显示颜色 黑/白 视觉角度 180 工作温度 0℃ - 50℃ 电池 无需电池 工作频率 13.56 MHZ NF…

数据结构单循环链表

循环链表的特点是无须增加存储量,仅对表的链接方式稍作改变,即可使得表处理更加方便灵活。 【例】在链表上实现将两个线性表(a1,a2,…,an)和(b1,b2,…,bm)连接成一个线性表(a1&…

智云通CRM:那些令你无法控制的销售局面(一)

销售的复杂性并不仅仅是指购买者得人数很多。复杂销售的定义在最近的十年里有了突破性的变化和发展,这种变化和发展中出现了很多挑战,不仅业务员,就连业务经理都难以应对。因此,唯有制定简化处理程序的计划才能妥善应对这一局面。…

利用if语句求解成绩等级问题

1 问题 成绩进行划分等级,人工划分容易出错,且数量庞大。 2 方法 public class Text06 { public static void main(String[] args) { int score100; System.out.println("score"); // 1.成绩大于等于85 if (sc…