目录
前言
1、TCP/IP分层模型
2、ARP缓存
3、TCP 协议之所以提供可靠传输,不怕丢包、乱序的主要的原因是
4、以太网数据链路层MII/GMII/RMII/RGMII四种常用接口
5、在以太网通信协议LWIP中,数据包管理机构采用数据结构pbuf 分类包括
6、关于以太网MAC帧传输先后顺序由左至右正确的是
7、在以太网通信中,数据从上层到下层交付时,要进行封装;同理,当目标主机接收到数据时,数据由下层传递给上层时需要进行拆封。这就是数据的封装与拆封
8、在以太网通信协议LWIP中,关于网络数据包pbuf的各种分类
9、在以太网通信中,如果要判断两个 IP 地址是否处于同一个子网
10、根据 IP 地址中网络地址和主机地址两部分分别占多少位的不同,将 IP 地址划分为 5 类,分别为 A、B、C、D、E 五类
11、不属于以太网物理层子层的是
12、TCP适用于对数据完整性要求很高的场景
13、在TCP协议首部中,保留位之后有 6 个标志位,分别是URG/ACK/PSH/RST/SYN/FIN
14、关于数据链路层中MII接口
15、在以太网通信中,当前网络中的主流程序设计都是使用 socket 进行编程的,在Linux中,socket()函数原型是:int socket(int domain, int type, int protocol)
16、在Linux以太网通信中,内核提供了专门用于网络通信数据的读取函数recv,recv()函数原型是:ssize_t recv(int sockfd, void *buf, size_t len, int flags)
17、在以太网通信中,当两个设备建立连接后,我们可以使用ping 命令来测试网络可达性,tracert 命令用来显示到达目的主机的路径。这两个命令是基于哪个协议的
18、在以太网通信中, 关于OSI 参考模型中每一层的作用
19、在以太网通信中,TCP 协议在建立连接、断开连接以及数据传输过程中都会呈现出现不同的状态,不同的状态采取的动作也是不同的,TCP状态包括
20、在以太网通信中,一个主机和另一个主机进行直接通信,必须要知道目标主机的MAC地址
21、TCP与UDP的主要区别
22、以太网中所有的站点共享一个通信信道,因为多个站点可以同时向网络上发送数据,所以需要一些检测机制
23、在以太网通信中,当服务器程序accept()函数与远程客户端之间建立连接后,accept()函数返回
24、物理层的主要功能是
25、不属于以太网MAC帧中FCS字段校验范围的是
26、在Linux以太网通信中,send()函数用来发送数据, send()可以通过参数 flags 指定一些标志,来改变处理传输数据的方式。关于这些flag,描述不正确的是
27、在以太网通信中,以太网数据帧结构不包括
28、在以太网通信中,如果调用 accept()函数时,并没有客户端请求连接,此时 accept()会
29、在微型嵌入式操作系统中,以太网通信常用的协议栈就是LWIP,LWIP是瑞典计算机科学院(SICS)的Adam Dunkels等开发的一个小型开源的TCP/IP协议栈。LWIP 是轻量级 IP 协议,有无操作系统的支持都可以运行。
30、在以太网通信中,常用的就是TCP协议,TCP是一种面向连接的、可靠的、基于 IP 的传输协议。关于TCP描述
31、在网络通信中,端口号本质上就是一个数字编号,用来在一台主机中唯一标识一个能上网的进程,端口号的取值范围为 0~65535。很多常见的服务器它都有特定的端口号
32、以太网通信中,当数据由上层发送到传输层时,数据会被封装为 TCP 数据段,我们将其称为 TCP 报文,TCP 报文由 TCP 首部+数据区域组成。TCP首部信息不包括
33、ARP协议中的免费ARP说法错误
34、以下关于以太网MAC帧组成错误的是
35、在以太网通信中,IP 地址用于标识互联网中的每台主机的身份,关于IP地址描述,不正确的是
36、在Linux以太网通信中,connect()函数原型是:int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
37、在Linux以太网通信中,也可以通过 read()函数可以从一个socket描述符中读取指定字节大小的数据。关于read函数
38、在以太网通信中,我们有时候需要在点分十进制字符串和二进制地址之间进行转换。如果我们想将点分十进制表示的字符串形式转换成二进制Ipv6 地址。则可以调用函数
牛客网刷刷刷在去年秋招之后就断更很久了,博主决定居安思危,在有空的时候多刷点题,提高一下应试素养,记录一下成长点滴。话不多说,开始今天的网络通讯协议的学习
常用的TCP/IP 分层模型有两种,TCP/IP 五层模型和TCP/IP 四层模型。
TCP/IP 五层模型中,将 OSI 七层模型的最上三层应用层、表示层和会话层合并为一个层,即应用层,所以 TCP/IP 五层模型包括:应用层、传输层、网络层、数据链路层以及物理层。
TCP/IP 四层模型,与五层模型唯一不同的就是将数据链路层和物理层合并为网络接口层,所以 TCP/IP 四层模型包括:应用层、传输层、网络层、网络接口层。
缓存中的静态ARP项目通过手工配置和维护,不会被老化,不会被动态ARP项目覆盖。直到重新启动计算机为止。
TCP 协议之所以提供可靠传输,不怕丢包、乱序。主要的原因是:
①、TCP 协议采用发送应答机制,即发送端发送的每个 TCP 报文段都必须得到接收方的应答,才能认为这个 TCP 报文段传输成功。
②、TCP 协议采用超时重传机制,发送端在发送出一个 TCP 报文段之后启动定时器,如果在定时时间内未收到应答,它将重新发送该报文段。
③、由于 TCP 报文段最终是以 IP 数据报发送的,而 IP 数据报到达接收端可能乱序、重复、所以 TCP协议还会将接收到的 TCP 报文段重排、整理、再交付给应用层。
TCP 协议的滑动窗口机制是用来TCP流量控制的,不属于TCP协议稳定可靠的主要原因
RGMII接口的RXD和TXD信号位宽均是4位,有效的避免了GMII管脚多(24PIN)导致封装成本增加。
在LWIP中,pbuf 共分为四类:PBUF_RAM、PBUF_ROM、PBUF_REF和 PBUF_POOL。
根据IEEE802.3协议要求,MAC帧传输顺序为前导码-定界符-目的地址-源地址-LENGTH/TYPE-DATA/PAD-校验字段-扩展字段
数据封装如下:
当用户发送数据时,将数据向下交给传输层,但是在交给传输层之前,应用层相关协议会对用户数据进行封装,譬如 MQTT、HTTP 等协议,其实就是在用户数据前添加一个应用程序头部,这是处于应用层的操作,最后应用层通过调用传输层接口来将封装好的数据交给传输层。
传输层会在数据前面加上传输层首部传输层首部可以为 TCP 首部,也可以是 UDP 首部,然后向下交给网络层。
网络层会在数据前面加上网络层首部(IP 首部),然后将数据向下交给链路层,链路层会对数据进行最后一次封装,即在数据前面加上链路层首部(以太网接口为例,对应以太网首部),然后将数据交给网卡。
最后,由网卡硬件设备将数据转换成物理链路上的电平信号,数据就这样被发送到了网络中。
当数据被目标主机接收到之后,会进行相反的拆封过程,将每一层的首部进行拆解最终得到用户数据。所以,数据的接收过程与发送过程正好相反,可以概括为 TCP/IP 模型中的各层协议对数据进行解析的过程。
PBUF_RAM 类型的 pbuf 主要通过内存堆分配得到的。这种类型的 pbuf 在协议栈中是用得最多的。PBUF_POOL 类型和 PBUF_RAM 类型的 pbuf 有很大的相似之处,但它主要通过内存池分配得到的。这种类型的 pbuf 可以在极短的时间内得到分配。PBUF_ROM 和 PBUF_REF 类型的 pbuf 基本相同,它们的申请都是在内存堆中分配一个相应的 pbuf 结构头,而不申请数据区的空间。这就是它们与 PBUF_RAM 和 PBUF_POOL 的最大区别。PBUF_ROM 和 PBUF_REF 类型的区别在于前者指向 ROM 空间内的某段数据,而后者指向 RAM 空间内的某段数据。
在以太网通信中,可通过网络标识来进行判断两个 IP 地址是否处于同一个子网,网络标识定义如下:
网络标识 = IP 地址 & 码 子网掩码
2 个 IP 地址的网络标识相同,那么它们就处于同一网络。譬如 192.168.1.50 和 192.168.1.100,这 2 个都是 C 类地址,对应的子网掩码为 255.255.255.0,很明显,这两个 IP 地址与子网掩码进行按位与操作时得到的结果(网络标识)是一样的,所以它们处于同一网络。
一个 A 类 IP 地址由 1 个字节网络地址和 3 个字节主机地址组成,A 类地址范围为:1.0.0.1 ~ 127.255.255.254;
一个 B 类 IP 地址由 2 个字节的网络地址和 2 个字节的主机地址组成,B 类地址范围:128.0.0.1 ~ 191.255.255.254。
一个 C 类 IP 地址由 3 字节的网络地址和 1 字节的主机地址组成,C 类地址范围为:192.0.0.1 ~ 223.255.255.254。
D 类 IP 地址第一个字节以“1110”开始,它是一个专门保留的地址,它并不指向特定的网络,D 类地址范围:224.0.0.1 ~ 239.255.255.254。
E 类 IP 地址以“llll0”开始,为将来使用保留。E 类地址范围:240.0.0.1 ~ 255.255.255.254。
LLC是逻辑链路控制的缩写,是数据链路层的子层,不属于物理层的子层
TCP适用于对数据完整性要求很高的场景,比如文件传输等,视频直播不属于对数据完整性要求较高的场景,在传输视频时,丢失一些数据,比如像素点,影响不会很大。
保留位之后有 6 个标志位,作用分别如下:
①、URG :首部中的紧急指针字段标志,如果是 1 表示紧急指针字段有效。
②、ACK :只有当 ACK=1 时,确认序号字段才有效。
③、PSH :当 PSH=1 时,接收方应该尽快将本报文段立即传送给其应用层。
④、RST :当 RST=1 时,表示出现连接错误,必须释放连接,然后再重建传输连接。复位比特还用来拒绝一个不法的报文段或拒绝打开一个连接。
⑤、SYN :SYN=1,ACK=0 时表示请求建立一个连接,携带 SYN 标志的 TCP 报文段为同步报文段。
⑥、FIN :为 1 表示发送方没有数据要传输了,要求释放连接。
MII接口中 RX_CLK和TX_CLK均是由PHY提供的
socket()函数类似于 open()函数,它用于创建一个网络通信端点,如果成功则返回一个网络文件描述符,通常把这个文件描述符称为 socket 描述符,这个 socket 描述符跟文件描述符一样,后续的操作都有用到它,把它作为参数,通过它来进行一些读写操作。该函数包括 3 个参数
参数 domain 用于指定一个通信域;这将选择将用于通信的协议族。
参数 type 指定套接字的类型。
参数 protocol 通常设置为 0,表示为给定的通信域和套接字类型选择默认协议。
在Linux中,不论是客户端还是服务器都可以通过 revc()函数读取网络数据,它与 read()函数的功能是相似的。参数sockfd 指定套接字描述符,参数 buf 指向了一个数据接收缓冲区,参数 len 指定了读取数据的字节大小,参数 flags 可以指定一些标志用于控制如何接收数据。这些标志如下所示:
MSG_CMSG_CLOEXEC 为 UNIX 域套接字上接收的文件描述符设置执行时关闭标志
MSG_DONTWAIT 启动非阻塞操作(相当于 O_NONBLOCK)
MSG_ERRQUEUE 接收错误信息作为辅助数据
MSG_OOB 如果协议支持,获取带外数据
MSG_PEEK 返回数据包内容而不真正取走数据包
MSG_TRUNC 即使数据包被截断,也返回数据包的长度
MSG_WAITALL 等待知道所有的数据可用(仅 SOCK_STREAM)
在以太网通信中,ping 和 tracert是两个常用网络管理命令,ping 用来测试网络可达性,tracert 用来显示到达目的主机的路径。ping和 tracert 都利用 ICMP 协议来实现网络功能。ICMP协议是一种面向无连接的协议,用于传输出错报告控制信息。主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息。ARP 协议是以太网地址解析协议,IGMP 协议用于网络组管理,可以实现多播数据的接收;SNMP,简单网络管理协议。
应用层:应用层(Application Layer)是 OSI 参考模型中的最高层,是最靠近用户的一层,为上层用户提供应用接口,也为用户直接提供各种网络服务。我们常见应用层的网络服务协议有:HTTP、FTP、TFTP、SMTP、SNMP、DNS、TELNET、HTTPS、POP3、DHCP。
表示层:表示层(Presentation Layer)提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别。如果必要,该层可提供一种标准表示形式,用于将计算机内部的多种数据格式转换成通信中采用的标准表示形式。数据压缩/解压缩和加密/解密(提供网络的安全性)也是表示层可提供的功能之一。
会话层:会话层(Session Layer)对应主机进程,指本地主机与远程主机正在进行的会话。会话层就是负责建立、管理和终止表示层实体之间的通信会话。该层的通信由不同设备中的应用程序之间的服务请求和响应组成。将不同实体之间表示层的连接称为会话。因此会话层的任务就是组织和协调两个会话进程之间的通信,并对数据交换进行管理。
传输层:传输层(Transport Layer)定义传输数据的协议端口号,以及端到端的流控和差错校验。该层建立了主机端到端的连接,传输层的作用是为上层协议提供端到端的可靠和透明的数据传输服务,包括差错校验处理和流控等问题。我们通常说的,TCP、UDP 协议就工作在这一层,端口号既是这里的“端”。
网络层:进行逻辑地址寻址,实现不同网络之间的路径选择。本层通过 IP 寻址来建立两个节点之间的连接,为源端发送的数据包选择合适的路由和交换节点,正确无误地按照地址传送给目的端的运输层。网络层也就是通常说的 IP 层。该层包含的协议有:IP(Ipv4、Ipv6)、ICMP、IGMP 等。
数据链路层:数据链路层(Data Link Layer)是 OSI 参考模型中的第二层,负责建立和管理节点间逻辑连接、进行硬件地址寻址、差错检测等功能。将比特组合成字节进而组合成帧,用 MAC 地址访问介质,错误发现但不能纠正。
物理层:物理层(Physical Layer)是 OSI 参考模型的最低层,物理层的主要功能是:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输,物理层的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。
TCP 拥有以下状态
CLOSED 状态
LISTENING 状态
ESTABLISHED 状态
TIME_WAIT 状态
SYN_SENT 状态( 客户端状态)
SYN_REVD 状态( 服务端状态)
FIN_WAIT_1 和 和 FIN_WAIT_2 状态:
CLOSE_WAIT 状态:
LAST_ACK 状态
在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。在以太网中,一个主机和另一个主机进行直接通信,必须要知道目标主机的MAC地址。但这个目标MAC地址是如何获得的呢,它就是通过地址解析协议获得的。所谓“地址解析”就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。ICMP 协议,用于网络调试与维护。IGMP 协议,用于网络组管理,可以实现多播数据的接收。SNMP是简单网络管理协议。
TCP面向连接,UDP是无连接的。
TCP面向字节流,UDP是面向报文的。
TCP只支持一对一,UDP支持一对一或者一对多。
TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。
以太网中所有的站点共享一个通信信道,在发送数据的时候,站点将自己要发送的数据帧在这个信道上进行广播,以太网上的所有其他站点都能够接收到这个帧,因为多个站点可以同时向网络上发送数据,在以太网中使用了CSMA/CD协议来减少和避免冲突。需要发送数据的工作站要先侦听网络上是否有数据在发送,如果有的只有检测到网络空闲时,工作站才能发送数据。当两个工作站发现网络空闲而同时发出数据时,就会发生冲突。这时,两个站点的传送操作都遭到破坏,工作站进行1-坚持退避操作。退避时间的长短遵照二进制指数随机时间退避算法来确定。
当有客户端连接请求到达时,accept()函数与远程客户端之间建立连接,accept()函数返回一个新的套接字。这个套接字与 socket()函数返回的套接字并不同,socket()函数返回的是服务器的套接字(以服务器为例),而accept()函数返回的套接字连接到调用 connect()的客户端,服务器通过该套接字与客户端进行数据交互,譬如向客户端发送数据、或从客户端接收数据。理解 accept()函数的关键点在于它会创建一个新的套接字,其实这个新的套接字就是与执行connect()(客户端调用 connect()向服务器发起连接请求)的客户端之间建立了连接,这个套接字代表了服务器与客户端的一个连接
利用传输介质为数据链路层提供物理连接,实现比特流的透明传输,物理层的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。网络数据信号的传输是通过物理层实现的,通过物理介质传输比特流。物理层规定了物理设备标准、电平、传输速率等。常用设备有集线器、中继器、调制解调器、网线、双绞线、同轴电缆等。路由器属于网络层设备。
根据IEEE802.3协议规定,FCS校验范围包括:目的地址、源地址、Length/Type字段、DATA/PAD字段,不包括前导码、定界符。
send 和 write 很相似,但是 send 可以通过参数 flags 指定一些标志,来改变处理传输数据的方式。这些标志如下所示:
MSG_CONFIRM 提供链路层反馈以保持地址映射有效
MSG_DONTROUTE 勿将数据包路由出本地网络
MSG_DONTWAIT 允许非阻塞操作(等价于使用 O_NONBLOCK)
MSG_EOR 如果协议支持,标志记录结束
MSG_MORE 延迟发送数据包允许写更多数据
MSG_NOSIGNAL 在写无连接的套接字时不产生 SIGPIPE 信号
MSG_OOB 如果协议支持,发送带外数据
以太网中的帧格式定义了站点如何解释从物理层传来的二进制串,即如何在收到的数据帧中分离出各个不同含义的字段。以太网帧结构包括6字节的源站MAC地址、6字节的目标站点MAC地址、2字节的协议类型字段、数据字段以及帧校验字段,MAC地址是一个六个字节长的二进制序列,全球唯一的标识了一个网卡。
accept()函数通常只用于服务器应用程序中,如果调用 accept()函数时,并没有客户端请求连接即等待连接队列中也没有等待连接的请求,此时 accept()会进入阻塞状态,直到有客户端连接请求到达为止。当有客户端连接请求到达时,accept()函数与远程客户端之间建立连接,accept()函数返回一个新的套接字
LWIP 支持的网络协议主要包括:
ARP 协议,以太网地址解析协议;
IP 协议,包括 IPv4 和 IPv6,支持 IP 分片与重装,支持多网络接口下数据转发;
ICMP 协议,用于网络调试与维护;
IGMP 协议,用于网络组管理,可以实现多播数据的接收;
UDP 协议,用户数据报协议;
TCP 协议,支持 TCP 拥塞控制,RTT 估计,快速恢复与重传等;DNS,域名解析;
SNMP,简单网络管理协议;
DHCP,动态主机配置协议;
AUTOIP,IP 地址自动配置;
PPP,点对点协议,支持 PPPoE。
关于 TCP 协议我们需要理解的重点如下:
①、TCP 协议工作在传输层,对上服务 socket 接口,对下调用 IP 层;
②、TCP 是一种面向连接的传输协议,通信之前必须通过三次握手与客户端建立连接关系后才可通信;
③、TCP 协议提供可靠传输,不怕丢包、乱序。
TCP 连接一旦建立,就可以在连接上进行双向的通信。任何一个主机都可以向另一个主机发送数据,数据是双向流通的,所以 TCP 协议是一个全双工的协议
HTTP 服务端口号为 80 超文本传输协议
FTP 服务端口号为 21 文件传输协议,使得主机间可以共享文件
SMTP 服务端口号为 25 简单邮件传输协议,它帮助每台计算机在发送或中转信件时找到下一个目的地。
TFTP 服务端口号为69 简单文件传输协议,主机之间进行简单文件传输
SSH 服务端口号为22 安全外壳协议,专为远程登录会话和其他网络服务提供安全性的协议
Telnet 服务端口号为 23 终端远程登录协议,它为用户提供了在本地计算机上完成远程主机工作的能力。
TCP 报文由 TCP 首部+数据区域组成,一般 TCP 首部通常为 20 个字节大小
免费 ARP可用于检测 IP 地址冲突。当一台主机发送了免费 ARP 请求报文后,如果收到了 ARP 响应报文,则说明网络内已经存在使用该 IP 地址的主机。
根据802.3协议规定,校验字段长度是4字节,采用CRC校验方式
传统的 IP 地址是一个 32 位二进制数的地址,也叫 IPv4 地址,由 4 个 8 位字段组成。除了 IPv4 之外,还有 IPv6,IPv6 采用 128 位地址长度,8 个 16 位字段组成,本小节我们暂时不去理会 IPv6 地址。在网络通信数据包中,IP 地址以 32 位二进制的形式表示;而在人机交互中,通常使用点分十进制方式表示,譬如 192.168.1.1,这就是点分十进制的表示方式。IP 地址中的 32 位实际上包含 2 部分,分别为网络地址和主机地址,可通过子网掩码来确定网络地址和主机地址分别占用多少位。
该函数用于客户端应用程序中,客户端调用 connect()函数将套接字 sockfd 与远程服务器进行连接,参数 addr 指定了待连接的服务器的 IP 地址以及端口号等信息,参数 addrlen 指定了 addr 指向的 struct sockaddr对象的字节大小。客户端通过 connect()函数请求与服务器建立连接,对于 TCP 连接来说,调用该函数将发生 TCP 连接的握手过程,并最终建立一个 TCP 连接,而对于 UDP 协议来说,调用这个函数只是在 sockfd 中记录服务器IP 地址与端口号,而不发送任何数据。
read是文件I/O中的操作函数,在Linux中,也可以通过 read()函数可以从一个socket描述符中读取指定字节大小的数据。套接字描述符也是文件描述符,所以使用 read()函数读取网络数据时,read()函数的参数 fd 就是对应的套接字描述符。read()调用成功将返回读取到的字节数,此返回值受文件剩余字节数限制,当返回值小于指定的字节数时并不意味着错误;这可能是因为当前可读取的字节数小于指定的字节数,比如已经接近文件结尾,或者正在从管道或者终端读取数据,或者 read()函数被信号中断等,出错返回-1 并设置 errno,如果在调 read 之前已到达文件末尾,则这次 read 返回 0
inet_pton()函数和inet_aton()函数都可以将点分十进制表示的字符串形式转换成二进制 Ipv4地址,但是inet_aton()函数不能转换成Ipv6 地址,inet_pton()可以。inet_ntop()和inet_ntoa ()函数是反过来的。