小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
1、网络程序的设计模式有哪些?
C/S 模式: 传统的网络应用设计模式,客户机(client) / 服务器(server)模式。需要在
通讯两端各自部署客户机和服务器来完成数据通信
优点:协议可以自定义(灵活) 数据可以提前缓存到本机上,后续运行快
缺点:客户端安装在主机电脑上,对用户的安全有一定威胁 需要分别开发客户端和服务器,
而且需要联合调试,工作量大
使用场景:数据量访问比较大,要求稳定性较高
B/S 模式: 浏览器(browser) / 服务器(server)模式。只需在一端部署服务器器,而另外
一端使用每台PC 都默认配置的浏览器即可完成数据的传输。
优点:相对安全、工作量小、跨平台
缺点:协议是定死的,不能提前数据缓存
使用场景:数据访问量较小
2、谈谈网络的分层结构
七层模型:
- 物理层:不是指具体的物理设备,指的是物理设备的标准制定(网线 光纤的接口类型 网卡的电流强弱)比特流
- 数据链路路层:负责完整的帧数据收发 (帧数据可以独立在网络传输的数据) mac地址封装和解封装交换器就工作在这一层;
- 网络层:负责IP地址封装和解封装,逻辑主机的识别路由器工作在这一层;
- 传输层:负责的是协议端口的封装和解封装,识别不同的进程通信,数据段分组和重组;
- 会话层:通过传输层建立通信线路,发送或接受请求;
- 表示层:对数据进行加密解密、压缩、解压缩,将计算机能识别的信息转换成人能识别的信息;
- 应用层:具体的网络通信
app(QQ FQ Weixin 浏览器);
四层模型:
-
应用层:
FTP文件传送协议telnet远程登录协议http超文本传送协议 -
传输层:不同进程识别(端⼝口)
TCP传输控制协议UDP用户数据报协议 -
网络层:不同主机识别(
IP)IP网际协议ICMP网络控制报文协议(ping命令) -
数据链路层:不不同物理设备(网卡)的识别(
MAC地址)arp地址解析协议(ip—>mac)rarp逆地址解析协议(mac———>ip)
3、我们是如何知道要前往的下一块网卡的mac地址(目的mac地址)?
通过arp表以及arp协议。链路层先查看路由表中是否记录了下一块网卡的mac地址,如果没有就调用arp协议获得下一块网卡的mac地址。
4、分别描述一下IP地址以及端口的作用
IP地址在网络环境中表示唯一的主机,端口可以在主机中表示唯一的进程。
网络层定义了源和目的 IP,传输层定义了源和目的的端口,这样就可以指定由“源主机的某进程”到“目的主机的某进程”的通信
5、谈谈你对字节序的理解
字节序就是主机存放数据的顺序,一般在异构计算机以及多字节的时候才讨论字节序。字节序的分为本地字节序,网络字节序。字节序的存储方式有大端存储以及小端存储,而网络字节序就是大端存储
6、描述一下TCP与UDP的区别
TCP与UDP都是传输层协议,进程与进程间的通信。
- TCP传输控制协议:面向连接编程,需要建立连接—>使用链接—>关闭链接,失败重传、排序检错,面向数据传输,不支持广播、多播。
- UDP用户报文协议:面向无连接编程,不排序,不重传,不检错,简单的应答服务,支持广播、多播。
7、谈谈select的优缺点
优点:
一个线程就可以支持多个客户端(多路 IO 都有这个优点!),可以跨平台(select 独有)
缺点:
同时监听文件描述符的上限是 1024 个
注意:不是因为打开文件的上限是 1024(上限数可以修改),而是因为在 select 底层实
现时候,fd_set使⽤用了了宏 FD_SETSIZE = 1024
返回值是一个数量,需要循环遍历判断到底谁符合条件,因此高并发少访问的时候,效率低监
听集合和满足监听条件的集合是同一个集合,select 后会改变原监听集合,使其无法再次使
用,因此,select 前需要将原监听集合保存
8、谈谈poll相较于select的优点
select 的监听和返回的集合是不分离的,是通过传入传出的方式实现而 poll 通过“参数 1”的结构体实现请求和返回分离 poll 相较于 select 的劣势:不能跨平台,只能在linux下使用,导致 poll 地位比较尴尬
9、谈谈集线器、交换机、路由器器的作⽤
集线器:Hub发送到集线器上的数据会被集线器广播到连接该集线器的所有主机上共享带宽,整形放大,工作在物理层
交换机:switchs 单播、独享带宽、有自主学习功能(mac),拓展网络接口工作在链路层(二层交换机)
- 3层交换机(核心层在第二层,具备网段划分的功能 VLAN虚拟局域网)
- 4层交换机(核心层在第二层,具备端口映射功能)
路由器:不同网段 通信的桥梁 实现不同网段的数据传输,工作在网络层。
10、描述一下三次握⼿手以及四次挥手的过程
11、tcp和udp的优缺点
- TCP面向连接 (如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
- TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达; UDP尽最大努力交付,即不保证可靠交付Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。
- UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。
- 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
- TCP对系统资源要求较多,UDP对系统资源要求较少。
12、pool、epoll与select的区别
select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。
(1)select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。而epoll其实也需要调用epoll_wait不断轮询就绪链表,期间也可能多次睡眠和唤醒交替,但是它是设备就绪时,调用回调函数,把就绪fd放入就绪链表中,并唤醒在epoll_wait中进入睡眠的进程。虽然都要睡眠和交替,但是select和poll在“醒着”的时候要遍历整个fd集合,而epoll在“醒着”的时候只要判断一下就绪链表是否为空就行了,这节省了大量的CPU时间。这就是回调机制带来的性能提升。
(2)select,poll每次调用都要把fd集合从用户态往内核态拷贝一次,并且要把current往设备等待队列中挂一次,而epoll只要一次拷贝,而且把current往等待队列上挂也只挂一次(在epoll_wait的开始,注意这里的等待队列并不是设备等待队列,只是一个epoll内部定义的等待队列)。这也能节省不少的开销。
13、io模型有哪几种
在UNIX/Linux下主要有4种I/O 模型:
- 阻塞I/O:最常用、最简单、效率最低
- 非阻塞I/O:可防止进程阻塞在I/O操作上,需要轮询
- I/O 多路复用:允许同时对多个I/O进行控制
- 信号驱动I/O:一种异步通信模型
14、如何实现tcp并发服务器,为什么TCP服务器默认是循环服务器?
如何实现TCP并发服务器
- 方法1:使用多线程实现tcp并发服务器
- 方法2:使用多进程实现tcp并发服务器
- 方法3:使用IO多路复用实现TCP并发服务器
原因是因为TCP服务器端有两个阻塞函数,accept和recv,无法让这两个函数独立运行,所以无法实现并发
15、网络超时检测的本质和实现方式
介于阻塞和非阻塞之间,设置一定的时间,在时间到达之内如果没有数据则一直阻塞,如果时间到了还没有数据,则变成非阻塞
网络超时检测方法
- 方法1:使用setsockopt实现网络超时检测
- 方法2:使用select实现网络超时检测
- 方法3:使用alarm闹钟实现网络超时检测
16、tcp网络编程流程
服务器:server
- 创建套接字 socket()
- 填充服务器网络信息结构体 struct sockaddr_in
- 将套接字与服务器的网络信息结构体绑定 bind()
- 将套接字设置为被动监听状态 listen()
- 阻塞等待客户端连接 accept()
- 进行通信 read()/write() 或 recv()/send() 或 recvfrom()/sendto()
- 关闭套接字 close()
客户端:client
- 创建套接字 socket()
- 填充服务器网络信息结构体 struct sockaddr_in
- 向服务器发送连接请求 connect()
- 进行通信 read()/write() 或 recv()/send() 或 recvfrom()/sendto()
- 关闭套接字 close()
17、udp网络编程流程
服务器:
- 创建套接字 socket()
- 填充服务器网络信息结构体 struct sockaddr_in
- 将套接字与服务器网络信息结构体绑定 bind()
- 进行通信 recvfrom()/sendto()
客户端:
- 创建套接字 socket()
- 填充服务器网络信息结构体 struct sockaddr_in
- 进行通信 recvfrom()/sendto()
18、udp本地通信需要注意哪些方面
客户端需要通过bind函数绑定自己的本地信息结构体sockaddr_un,否则服务器无法给客户端发送数据,因为本地通信中客户端的信息操作系统不会自动分配
19、怎么修改文件描述符的标志位
使用fcntl函数
20、sqlite数据库的基本使用,包括增删改查
- 创建一张表 create table 表名(字段名称1 字段类型,字段名称2 字段类型, ....);
- 向表中插入一条记录 insert into 表名 values(字段值1,字段值2,...);
- 查询记录 select * from 表名;
- 删除记录 delete from 表名 where 要删除的字段名=要删除的字段值;
21、基于udp的聊天室如何实现数据群发
在服务器端创建一个链表,每一个链表的结点的数据域保存用户的网络信息结构体,当有用户登录后将新用户的网络信息结构体保存在链表中,群发信息时遍历链表给每一个数据域保存的网络信息结构体发送数据即可
22、在线词典如何实现查询单词
单词和解释保存在一个txt文档中,使用文件io对文件进行操作获取解释,文件每一行存储的是单词和解释,所以每次读取一行比较是否是查询的单词,然后将查询到的解释发送给客户端。
如何提高查询效率? 可以采用二分查找法,也称之为折半查找,文件中的单词的首字母都是按照ascii按照从小到大排列的,所以可以将所有的单词按照ascii值分成两个部分,查询单词时先对比首字母是哪一个范围的,这样查询起来效率会更高一点
23、两个电脑 ,网段不同能不能建立连接,在中间加什么就可以连接
可以加路由器。路由器主要就是实现不同网段的主机通信的
24、三次握手每次握手在哪个函数
服务器:listen和accept
客户端:connect
25、MTU和MSS是什么
MTU:
最大传输单元(Maximum Transmission Unit,MTU)用来通知对方所能接受数据服务单元的最大尺寸,说明发送方能够接受的有效载荷大小。 是包或帧的最大长度,一般以字节记。如果MTU过大,在碰到路由器时会被拒绝转发,因为它不能处理过大的包。如果太小,因为协议一定要在包(或帧)上加上包头,那实际传送的数据量就会过小,这样也划不来。大部分操作系统会提供给用户一个默认值,该值一般对用户是比较合适的
以太网和802.3对数据帧的长度都有一个限制,其最大值分别是1500字节和1492字节
MSS:
最大报文段长度(MSS)是TCP协议的一个选项,用于在TCP连接建立时,收发双方协商通信时每一个报文段所能承载的最大数据长度(不包括文段头)
MSS选项由四个字节构成:选项类型代码为2(1字节),选项长度(1字节),选项数据(2字节)共计4字节。其中,选项数据的2字节代表了MSS的值。如果MSS选项数据为512,则表示该报文段的发送方可以处理的最大报文段长度为512字节(不包括TCP与IP协议头长度)。
26、IP头有多大,都有什么
IP头20个字节
27、DNS协议怎么用
DNS 是域名系统 (Domain Name System) 的缩写,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。这也是DNS的官方说法。
DNS的作用:在互联网中,其实没有类似于www.xxx.com这种域名方式,而替代的是以IP地址,如222.222.222.222,那我们在IE地址栏中应当输入222.222.222.222才能打开网站www.xxx.com
28、tcpdump是什么
根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。 tcpdump 普通情况下,直接启动tcpdump将监视第一个网络接口上所有流过的数据包。
29、列举从浏览器地址输入www.baidu.com并回车到页面返回,整个过程涉及到的通信协议以及作用
总体来说分为以下几个过程:
- DNS 解析:将域名解析成 IP 地址
- TCP 连接:TCP 三次握手
- 发送 HTTP 请求
- 服务器处理请求并返回 HTTP 报文
- 浏览器解析渲染页面
- 断开连接:TCP 四次挥手
会使用到的协议:
- DNS 域名解析协议(通过url获取ip地址)
- http 超文本传输协议,访问web服务器
- http是基于TCP的应用层协议,所以传输层需要使用tcp协议
- 网络层是IP协议
- 主机与服务器访问时需要获取李主机最近一方路由器的mac地址,如果arp表中没有,需要使用arp协议获取,