Linux网络编程—网络基础概念
第一章:计算机网络背景
网络发展
独立模式:计算机之间相互独立;

网络互联:多台计算机连接在一起,完成数据共享;

局域网LAN:计算机数量更多了,通过交换机和路由器连接在一起;

广域网WAN:将远隔千里的计算机都连在一起;

所谓"局域网"和"广域网"只是一个相对的概念。比如,我们有"中国特色"的广域网,也可以看作一个比较大的局域网。
计算机是人的工具,人要协同工作,注定了网络的产生是必然的。
第二章:初识协议
- "协议"是一种约定。
- 打电话约定电话铃响的次数的约定

计算机之间的传输媒介是光信号和电信号。通过"频率"和"强弱"来表示 0 和 1 这样的信息。要想传递各种不同的信息,就需要约定好双方的数据格式。
思考:只要通信的两台主机,约定好协议就可以了么?
- 定好协议,但是你用频率表示01,我用强弱表示01,就好比我用中国话,你用葡萄牙语一样,虽然大家可能遵守的一套通信规则,但是语言不同,即是订好了基本的协议,也是无法正常通信的
所以,完善的协议,需要更多更细致的规定,并让参与的人都要遵守。
- 计算机生产厂商有很多;
- 计算机操作系统,也有很多;
- 计算机网络硬件设备,还是有很多;
- 如何让这些不同厂商之间生产的计算机能够相互顺畅的通信?就需要有人站出来,约定一个共同的标准,大家都来遵守,这就是网络协议;
协议分层
协议本质也是软件,在设计上为了更好的进行模块化,解耦合,也是被设计成为层状结构的
软件分层的好处

- 在这个例子中,我们的"协议"只有两层:语言层、通信设备层。
- 但是实际的网络通信协议,设计会更加复杂,需要分更多的层
- 但是通过上面的简单例子,我们能理解,分层可以实现解耦合,让软件维护的成本更低

OSI七层模型
- OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范;
- 把网络从逻辑上分为了7层。每一层都有相关、相对应的物理设备,比如路由器,交换机;
- OSI 七层模型是一种框架性的设计方法,其最主要的功能就是帮助不同类型的主机实现数据传输;
- 它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整。通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯;
- 但是,它既复杂又不实用;所以我们按照TCP/IP四层模型来讲解。

- 其实在网络角度,OSI定的协议7层模型其实非常完善,但是在实际操作的过程中,会话层、表示层是不可能接入到操作系统中的,所以在工程实践中,最终落地的是5层协议。
- 但是要理解上面的话,需要我们学习完网络才可以理解,这里知道就可以。
TCP/IP五层(或四层)模型
TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。
TCP/IP通讯协议采用了5层的层级结构,每一层都调用它的下一层所提供的网络来完成自己的需求。
- 物理层:负责光/电信号的传递方式。比如现在以太网通用的网线(双绞线)、早期以太网采用的同轴电缆(现在主要用于有线电视)、光纤,现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器(Hub)工作在物理层。
- 数据链路层:负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。有以太网、令牌环网,无线LAN等标准。交换机(Switch)工作在数据链路层。
- 网络层:负责地址管理和路由选择。例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间的数据传输的线路(路由)。路由器(Router)工作在网络层。
- 传输层:负责两台主机之间的数据传输。如传输控制协议 (TCP),能够确保数据可靠的从源主机发送到目标主机。
- 应用层:负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。我们的网络编程主要就是针对应用层。

物理层我们考虑的比较少,我们只考虑软件相关的内容。因此很多时候我们直接称为 TCP/IP四层模型。
一般而言
- 对于一台主机,它的操作系统内核实现了从传输层到物理层的内容;
- 对于一台路由器,它实现了从网络层到物理层;
- 对于一台交换机,它实现了从数据链路层到物理层;
- 对于集线器,它只实现了物理层;
但是并不绝对。很多交换机也实现了网络层的转发;很多路由器也实现了部分传输层的内容(比如端口转发);
第三章:再识协议
上面的内容,我们只是懂了一些基本概念,还是达不到我们的目标,下面我们再次重新理解协议和协议分层。
为什么要有TCP/IP协议?
- 首先,即便是单机,你的计算机内部,其实都是存在协议的,比如:其他设备和内存通信,会有内存协议。其他设备和磁盘通信,会有磁盘相关的协议,比如:SATA,IDE,SCSI等。只不过我们感知不到罢了。而且这些协议都在本地主机各自的硬件中,通信的成本、问题比较少。
- 其次,网络通信最大的特点就是主机之间变远了。任何通信特征的变化,一定会带来新的问题,有问题就得解决问题,所以需要新的协议咯。


所以,为什么要有TCP/IP协议?本质就是通信主机距离变远了
什么是TCP/IP协议?
TCP/IP协议的本质是一种解决方案
TCP/IP协议能分层,前提是因为问题们本身能分层
TCP/IP协议与操作系统的关系(宏观上,怎么实现的)

所以究竟什么是协议?
截止到目前,我们还没接触过任何协议,但是如何朴素的理解协议,我们已经可以试试了。
OS源代码一般都是用C/C++语言写的。
下面,仔细看看下面的图

问题:主机B能识别data,并且准确提取a=10,b=20,c=30吗?
回答:答案是肯定的!因为双方都有同样的结构体类型struct protocol。也就是说,用同样的代码实现协议,用同样的自定义数据类型,天然就具有"共识",能够识别对方发来的数据,这不就是约定吗?
关于协议的朴素理解:所谓协议,就是通信双方都认识的结构化的数据类型
因为协议栈是分层的,所以,每层都有双方都有协议,同层之间,互相可以认识对方的协议。
第四章:网络传输基本流程
局域网网络传输流程图
局域网(以太网为例)通信原理
- 首先回答,两台主机在同一个局域网,是否能够直接通信?
- 原理类似上课
- 每台主机在局域网上,要有唯一的标识来保证主机的唯一性:mac地址
认识MAC地址
- MAC地址用来识别数据链路层中相连的节点;
- 长度为 48 比特位,即 6 个字节。一般用 16 进制数字加上冒号的形式来表示(例如:
- 08:00:27:03:fb:19)
- 在网卡出厂时就确定了,不能修改。mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址,可能会冲突;也有些网卡支持用户配置mac地址)。
- windows>ipconfig /all
后面我们详细谈论数据链路层的时候,会谈 mac 帧协议,此处我们做一个了解即可。

- 以太网中,任何时刻,只允许一台机器向网络中发送数据
- 如果有多台同时发送,会发生数据干扰,我们称之为数据碰撞
- 所有发送数据的主机要进行碰撞检测和碰撞避免
- 没有交换机的情况下,一个以太网就是一个碰撞域
- 局域网通信的过程中,主机对收到的报文确认是否是发给自己的,是通过目标mac地址判定
- 这里可以试着从系统角度来理解局域网通信原理
初步明白了局域网通信原理,再来看同一个网段内的两台主机进行发送消息的过程

而其中每层都有协议,所以当我进行上述传输流程的时候,要进行封装和解包

网络通信的本质: 就是贯穿协议栈的过程
下面我们明确一下概念

- 报头部分,就是对应协议层的结构体字段,我们一般叫做报头
- 除了报头,剩下的叫做有效载荷
- 故,报文 = 报头 + 有效载荷
然后,我们在明确一下不同层的完整报文的叫法
- 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)。
- 应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation)。
- 首部信息中包含了一些类似于首部有多长,载荷(payload)有多长,上层协议是什么等信息。
- 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,根据首部中的"上层协议字段"将数据交给对应的上层协议处理。

最后,在整体复盘一下:

在网络传输的过程中,数据不是直接发送给对方主机的,而是先要自顶向下将数据交付给下层协议,最后由底层发送,然后由对方主机的底层来进行接收,再自底向上进行向上交付,下面是一张示意图。
数据包封装和分用
下图为数据封装的过程

下图为数据分用的过程


从今天开始,我们学习任何协议,都要先宏观上建立这样的认识:
- 要学习的协议,是如何做到解包的?只有明确了解包,封包也就能理解
- 要学习的协议,是如何做到将自己的有效载荷,交付给上层协议的?
跨网络传输流程图
网络中的地址管理 - 认识IP地址
IP 协议有两个版本,IPv4 和 IPv6。我们整个的课程,凡是提到IP协议,没有特殊说明的,默认都是指 IPv4
- IP 地址是在 IP 协议中,用来标识网络中不同主机的地址;
- 对于 IPv4 来说,IP 地址是一个 4 字节,32 位的整数;
- 我们通常也使用 "点分十进制" 的字符串表示 IP 地址,例如 192.168.0.1;用点分割的每一个数字表示一个字节,范围是 0 - 255;
跨网段的主机的数据传输。数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器。
下面是一张示意图

首先理解一下IP地址的意义
- 为什么要去目标主机,先要走路由器?
- 目的IP的意义

然后结合封装与解包,体现路由器解包和重新封装的特点

对比IP地址和Mac地址的区别
- IP地址在整个路由过程中,一直不变(目前,我们只能这样说明,后面再修正)
- Mac地址一直在变
- 目的IP是一种长远目标,Mac是下一阶段目标,目的IP是路径选择的重要依据,mac地址是局域网转发的重要依据

提炼IP网络的意义和网络通信的宏观流程

IP网络层存在的意义:提供网络虚拟层,让世界的所有网络都是 IP 网络,屏蔽最底层网络的差异

第五章:Socket编程预备
1 . 理解源IP地址和目的IP地址
- IP 在网络中,用来标识主机的唯一性
- 注意:后面我们会讲 IP 的分类,后面会详细阐述 IP 的特点
但是这里要思考一个问题:数据传输到主机是目的吗?不是的。因为数据是给人用的。比如:聊天是人在聊天,下载是人在下载,浏览网页是人在浏览?
但是人是怎么看到聊天信息的呢?怎么执行下载任务呢?怎么浏览网页信息呢?通过启动的 qq,迅雷,浏览器。
而启动的 qq,迅雷,浏览器都是进程。换句话说,进程是人在系统中的代表,只要把数据给进程,人就相当于就拿到了数据。
所以:数据传输到主机不是目的,而是手段。到达主机内部,再交给主机内的进程,才是目的。
但是系统中,同时会存在非常多的进程,当数据到达目标主机之后,怎么转发给目标进程?这就要在网络的背景下,在系统中,标识主机的唯一性。

2 . 认识端口号
- 端口号(port)是传输层协议的内容。
- 端口号是一个2字节16位的整数;
- 端口号用来标识一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来处理;
- IP地址 + 端口号能够标识网络上的某一台主机的某一个进程;
- 一个端口号只能被一个进程占用。

端口号范围划分
- 0 - 1023 : 知名端口号,HTTP,FTP,SSH 等这些广为使用的应用层协议,他们的端口号都是固定的。
- 1024 - 65535 : 操作系统动态分配的端口号。客户端程序的端口号,就是由操作系统从这个范围分配的。
理解"端口号"和"进程ID"
我们之前在学习系统编程的时候,学习了 pid 表示唯一一个进程;此处我们的端口号也是唯一表示一个进程。那么这两者之间是怎样的关系?
另外,一个进程可以绑定多个端口号;但是一个端口号不能被多个进程绑定;
- 进程 PID 属于系统概念,技术上也具有唯一性,确实可以用来标识唯一的一个进程,但是这样做,会让系统进程管理和网络强耦合,实际设计的时候,并没有选择这样做。
理解源端口号和目的端口号
传输层协议(TCP 和 UDP)的数据段中有两个端口号,分别叫做源端口号和目的端口号。就是在描述"数据是谁发的,要发给谁";
理解socket
- 综上,IP 地址用来标识互联网中唯一的一台主机,port 用来标识该主机上唯一的一个网络进程
- IP+Port 就能表示互联网中唯一的一个进程
- 所以,通信的时候,本质是两个互联网进程代表人来进⾏通信,{srcIp,srcPort,dstIp,dstPort}这样的4元组就能标识互联网中唯⼀的两个进程
- 所以,网络通信的本质,也是进程间通信
- 我们把 ip+port 叫做套接字 socket


3 . 传输层的典型代表
如果我们了解了系统,也了解了网络协议栈,我们就会清楚,传输层是属于内核的,那么我们要通过网络协议栈进行通信,必定调用的是传输层提供的系统调用,来进行的网络通信。

认识TCP协议
此处我们先对 TCP (Transmission Control Protocol 传输控制协议)有一个直观的认识;后面我们再详细讨论TCP的一些细节问题
- 传输层协议
- 有连接
- 可靠传输
- 面向字节流
认识UDP协议
此处我们也是对 UDP (User Datagram Protocol 用户数据报协议)有一个直观的认识;后面再详细讨论。
- 传输层协议
- 无连接
- 不可靠传输
- 面向数据报
因为我们暂时还没有深入了解 tcp、udp 协议,此处只做了解即可
4. 网络字节序
我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分,网络数据流同样有大端小端之分。那么如何定义网络数据流的地址呢?
- 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出;
- 接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存;
- 因此,网络数据流的地址应这样规定:
- 先发出的数据是低地址,后发出的数据是高地址。
- TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。
- 不管这台主机是大端机还是小端机,都会按照这个TCP/IP规定的网络字节序来发送/接收数据;
- 如果当前发送主机是小端,就需要先将数据转成大端;否则就忽略,直接发送即可;

为使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。

- 这些函数名很好记,h 表示 host,n 表示 network,l 表示 32 位长整数,s 表示 16 位短整数。
- 例如 htonl 表示将 32 位的长整数从主机字节序转换为网络字节序,例如将IP地址转换后准备发送。
- 如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回;
- 如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回。
网络规定
所有发送到网络上的数据,都必须是大端的!
5 . socket编程接口
socket 常见API
// 创建 socket 文件描述符 (TCP/UDP,客户端 + 服务器)
int socket(int domain, int type, int protocol);
// 绑定端口号 (TCP/UDP,服务器)
int bind(int socket, const struct sockaddr *address, socklen_t address_len);
// 开始监听socket (TCP,服务器)
int listen(int socket, int backlog);
// 接收请求 (TCP,服务器)
int accept(int socket, struct sockaddr* address, socklen_t* address_len);
// 建立连接 (TCP,客户端)
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
sockaddr结构
socket API是一层抽象的网络编程接口,适用于各种底层网络协议,如IPv4、IPv6,以及后面要讲的UNIX Domain Socket。然而,各种网络协议的地址格式并不相同。

- IPv4和IPv6的地址格式定义在netinet/in.h中,IPv4地址用sockaddr_in结构体表示,包括16位地址类型,16位端口号和32位IP地址。
- IPv4、IPv6地址类型分别定义为常数AF_INET、AF_INET6。这样,只要取得某种sockaddr结构体的首地址,不需要知道具体是哪种类型的sockaddr结构体,就可以根据地址类型字段确定结构体中的内容。
- socket API可以都用struct sockaddr *类型表示,在使用的时候需要强制转化成sockaddr_in;这样的好处是程序的通用性,可以接收IPv4,IPv6,以及UNIX Domain Socket各种类型的sockaddr结构体指针做为参数;
sockaddr 结构

sockaddr_in 结构

虽然socket api的接口是sockaddr,但是我们真正在基于IPv4编程时,使用的数据结构是sockaddr_in;这个结构里主要有三部分信息:地址类型,端口号,IP地址。
in_addr 结构

in_addr用来表示一个IPv4的IP地址。其实就是一个32位的整数;

作业
1. 计算机技术和()是计算机网络产生于发展的两个最基本的因素
A.电话
B.通信协议
C.线路
D.各种协议
答案:B
A错误:电话只是网络通信方式的一种
B正确:由于网络是由各种通信协议以及硬件设备组成,其中硬件是网络通信的保障,网络通信协议标准是网络互连的基础
C和D选项过于宽泛
因此正确选项选择B选项
2. 下列不属于传输层的协议是()
A.TCP
B.UDP
C.SMTP
D.OSPF
答案:C
A:TCP协议为传输控制协议,在传输层工作
B:UDP协议为用户数据报协议,在传输层工作
C:SMTP协议为电子邮件传输协议,在应用层工作
D:OSPF为开放的最短路径优先协议,在传输层工作
3. ICMP报文通过()协议来传输
A.UDP
B.TCP
C.IP
D.ARP
答案:C
答案解析:
UDP协议为用户数据报协议,在传输层工作
TCP协议为传输控制协议,在传输层工作
IP协议为网际协议,在网络层工作
ARP协议为地址解析协议,在网络层工作
ICMP协议为Internet控制报文协议,它是TCP / IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息,所以是通过IP协议来进行传输
4. 用于域名解析的协议是()
A.HTTP
B.DNS
C.FTP
D.SMTP
答案:B
HTTP协议是超文本传输协议
DNS协议为域名解析协议
FTP协议为文件传输协议
SMTP协议为电子邮件传输协议
故选择B
5. 【多选题】以下关于网络协议分层理解正确的是()
A.网络协议分层使网络使用更加复杂,不利于人们的使用
B.OSI模型分为 7层,自下而上为,物理层,数据链路层,传输层,网络层,会话层,表示层,应用层
C.网络协议分层后每层利用紧邻的下层服务,更容易记住各层的功能
D.人们可以很容易的讨论和学习协议的规范细节
答案:CD
答案解析:
A : 网络协议分层将整个功能解耦出来,使得每层都完成不同的功能,方便人们的使用
B : OSI模型分为 7层,自下而上为,物理层,数据链路层,网络层,传输层,会话层,表示层,应用层
6. 以下关于网络协议分层说法不正确的是()
A.表示层一项重要的工作就是网络标准数据格式的转换
B.会话层负责管理传输层以下的分层
C.数据链路层是地址管理和路由选择
D.传输层管理两个节点之间的数据传输
答案:C
答案解析:
数据链路层完成帧同步,差错控制,流量管理,链路管理
7. 传统交换机和路由器分别运行在OSI参考模型的()
A.数据链路层和网络层
B.网络层和传输层
C.传输层和数据链路层
D.物理层和网络层
答案:A
答案解析:
交换机在数据链路层,路由器在网络层,因此正确选项为A选项
8. OSI参考模型中,()提供了差错报告,网络拓扑结构的功能
A.网络层
B.传输层
C.数据链路层
D.物理层
答案:C
答案解析:
传输层负责两端之间的数据传输
网络层负责地址管理与路由选择
数据链路层负责相邻设备之间数据帧传输,完成帧同步,差错控制,流量管理,链路管理
物理层负责物理光电信号传输
基于以上理解,正确选项为:C
9. 在OSI模型当中,第N层和其上的N+1层的关系是()
A.N层为N+1层提供服务
B.N+1层将从N层接的信息增加一个头部
C.N层利用N+1层的提供的服务
D.N层对N+1层没有任何作用
答案:A
答案解析:
在网络分层中,自下而上(这里注意自下而上,则 N为下层,N + 1为上层),第N层为N + 1层提供服务,N - 1层将从N层接的信息增加一个头部
A正确
B错误:说反了,应该是第N层从第N + 1层接的信息增加头部,下层为上层信息增加头部
C错误:说反了,N + 1层利用第N层提供的服务,上层利用下层提供的服务
D错误
10. 以下有关MAC地址意义和作用描述错误的是()
A.MAC地址与网络无关
B.在网卡出厂时就确定了, 不能修改. MAC地址通常是唯一的
C.MAC地址用来识别数据链路层中相连的节点
D.一台计算机只能有一个MAC地址
答案:D
答案解析:
MAC地址是物理网卡硬件地址,在出厂时就会设定,不能修改,它的大小是6字节,用于识别相邻设备,在链路层完成相邻设备之间的数据传输。
D错误:一台计算机可以绑定多个网卡,进而可以拥有多个MAC地址。
11. How long is a MAC address? ( )
A.4 bytes
B.6 bytes
C.8 bytes
D.10 bytes
答案:B
答案解析:
MAC地址,也叫物理硬件地址,用于识别相邻的两个物理硬件设备,它的大小为:6字节
12. A、B两个网络,IP均为静态分配,且IP段不同。当一台主机从一个A网络移到B一个网络时,以下说法正确的是()
A.必须改变它的IP地址和MAC地址
B.必须改变它的IP地址,但不需改动MAC地址
C.必须改变它的MAC地址,但不需改动IP地址
D.MAC地址、IP地址都不需改动
答案:B
答案解析:
每个网络都会有不同的网段,网段是该网络的标识,在该网络中分配的IP地址都会带有网段标识,标识自己所属网络,这样路由器才能进行路径规划,因此当主机改变所在网络时需要将IP地址改成该网段的ip地址,但是MAC地址不用修改,MAC地址本身也是不允许修改
13. IP数据报的收发方进行跨网投递时,发送方需利用ARP协议获取哪些信息()
A.接收方IP地址的MAC地址
B.发送方本网段路由器对应端口的MAC地址
C.接收方本网段路由器对应端口的MAC地址
D.发送方IP地址的MAC地址
答案:B
答案解析:
当需要跨网络进行传递的时候,也就是意味着需要找到该数据包的下一跳的MAC地址,所以认为从发送方出来,首先先到到达本网段的路由器,所以获取本网段的路由器的MAC地址
14. 下列IP地址和MAC地址说法错误的是()
A.IP地址的分配是基于网络拓朴,MAC地址的分配是基于制造商
B.IP地址应用于OSI第三层,即网络层,而MAC地址应用在OSI第二层,即数据链路层
C.数据链路层协议可以通过MAC地址使数据从一个节点传递到相同链路的另一个节点上
D.一个MAC地址只能对应唯一一个IP地址
答案:D
答案解析:
IP地址是一个数字,用于唯一标识网络中的一台主机。应用于网络层,基于网络拓扑描述起点和终点
Mac地址是物理网卡硬件地址,用于标识相邻设备,应用于链路层,
基于以上理解,描述正确的有 ABC 选项。
D错误:由于IP地址是一个逻辑地址,所以可以给MAC地址对应分配不同的IP地址,使网络通信更加灵活
15. 以下有关于数据包封装与分用描述错误的是()
A.应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation).
B.不同的协议层对数据包有不同的称谓,在传输层叫做数据报 (datagram),在网络层叫做段(segment),在链路层叫做帧(frame).
C.在网络层会增加IP首部,在对端的网络层,会去掉IP首部,并解析首部内容之后呈递给传输层
D.在tcp协议分用的过程当中,传输层会去掉tcp头部,将应用数据呈递给上层
答案:B
答案解析:
B : 不同的协议层对数据包有不同的称谓, 在传输层叫做段(segment), 在网络层叫做数据报(datagram), 在链路层叫做帧(frame).
16. OSI的哪一层通常同时使用报头和报尾进行封装()
A.网络
B.传输层
C.数据链路层
D.表示层
答案:C
答案解析:
在数据链路层不但会增加以太网头部还会在尾部加上以太网尾部
17. 以下有关于端口号的说法错误的是()
A.tcp的最大端口号是65535
B.端口号是一个2字节16位的整数
C.IP地址 + 端口号能够标识网络上的某一台主机的某一个进程
D.一个进程至多只能绑定一个端口
答案:D
答案解析:
端口号是一个无符号16位的整数,用于表示主机上的网络通信socket,因为是16位,因此最大端口号是65535(从0开始)
IP地址可以在网络当中标识一台主机,端口号可以在主机当中标识一个进程(socket会关联到对应进程)
一个进程当中对于端口的绑定是和socket强相关,理论上该进程如果创建多个socket, 可以给每一个socket都进行绑定一个端口
基于以上理解,错误选项为:D (一个进程可能会创建多个socket,因此有可能会绑定多个端口)
18. 当一个UDP报文道达目的主机时,操作系统使用( )选择正确的socket.
A.源IP地址
B.源端口号
C.目的端口号
D.目的IP地址
答案:C
答案解析:
IP地址用于标识主机,端口号用于标识主机上的对应网络通信socket
因此正确选项为C选项,通过目的端口号来区分是哪个socket
19. 在网络字节序中,所谓”小端”(little endian)说法正确的是( )
A.高字节数据存放在低地址处,低字节数据存放在高地址处
B.低字节位数据存放在内存低地址处, 高字节位数据存放在内存高地址处
C.和编译器相关
D.上述答案都不正确
答案:B
答案解析:
小端:低字节位数据存放在内存低地址处, 高字节位数据存放在内存高地址处
大端:高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址
网络字节序为大端字节序
20. 【多选题】socket编程中经常需要进行字节序列的转换,下列哪几个函数是将网络字节序列转换为主机字节序列?()
A.htons
B.ntohs
C.htonl
D.ntohl
答案:BD
答案解析:
函数名称解析:
- n 对应是 network
- h 对应是 host
- s 对应是 short
- l 对应是 long
因此网络字节序到主机字节序的转换是 ntoh,对应正确选项为:B和D
