网络编程day6

一、模拟面试

|-----------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| C语言中指针数组和数组指针的区别 | 指针数组本质上是一个数组,该数组中元素是指针变量,故指针数组是用来存储指针变量的一个数组; 数组指针本质上是一个指针变量,是存储数组地址的指针变量,该变量记录了数组的起始地址,该指针变量的偏移量为数组的数据类型大小。 |
| 结构体的字节对齐 | 结构体的字节对齐需要遵循结构体成员对齐和整体对齐原则; 成员之间的对齐原则按照自身的类型字节大小整数倍对齐,即成员变量的存储起始位置必须是自身类型大小的整数倍; 整体对其原则是按照最大字节成员数组类型的字节大小和8字节取小值,作为整体的对齐原则,为其分配对应的空间。 |
| TCP和UDP的区别 | TCP和UDP都是用于传输层的两种传输协议; TCP是面向连接的稳定的传输,进行传输前需要进行连接,停止发送也会进行断连,UDP是面向无连接的快速的传输,在传输时可以不用连接; TCP的传输不是实时的,等待合适时机以数据包的形式传输数据,因此可能会出现数据粘包的现象,UDP的传输是实时的,有多少传输多少,超出数据包大小的数据直接丢弃。 TCP发送数据包时,接收会向发送端返回ACK确认包,发送包收到相应数据包对应的ACK应答包,才会向接收端发送下一个数据包,同样,接收端再没有接受到下一个数据包之前,也会一直发送当前接收到的数据包的ACK应答包,因此TCP具有很高的稳定,确定性,不会出现数据丢失,重复的现象,而UDP不会这样,发送端只会在最短的时间内将数据发送给接收端,接收端会对接收到的数据进行校验。 因此TCP的效率低,稳定性高,数据传输正确性高,一般用于重要数据的传输,如账号密码等;UDP传输效率高,稳定性差,一般用于对实时性要求高的传输,如共享屏幕,视频通话等。 |
| 同步通信和异步通信的区别 | 同步通信是指阻塞的通信,异步通信是指非阻塞的通信; 同步通信指的是在多个任务通信时需要按照规定的逻辑顺序去进行,以避免对临界资源的错误访问和处理;同步通信信息连续发送,形成一个数据帧,当一个通信任务进行资源访问时其它通信任务阻塞等待; 异步通信则不会出现阻塞等待,例如消息队列,多任务可以非阻塞的异步的使用消息队列进行通信。 |
| 谈谈对多线程的理解 | 线程是任务调度的最小单位,多线程指的是在一个进程中有多个进程并发执行; 线程的五个基本状态分别为创建,就绪,运行,阻塞和死亡态,多线程就是并发执行多个任务,一个线程被创建且被唤醒后才进入就绪状态,等待CPU进行调度,当任务进行I/O申请等阻塞操作时会被挂起进入阻塞态,阻塞结束后才进入就绪态,运行中的任务在时间片用完后也会再次进入就绪队列等待CPU分配时间片,任务完成后进入死亡态; 线程消耗的资源小,但是多个线程共享同一个进程的资源,因此一个线程出现问题可能会对其它线程造成影响,进程则一般不会; 线程在用户空间和内核空间进行切换时消耗的资源更少,因此多线程适合I/O密集型操作。 |
| 大小端和大小端的验证 | 因不同主机架构不同,在对多字节整数进行存储时,会出现大小端的问题,数据高位存储在地址低位的存储方式称为大端存储,数据低位存储在地址低位的存储方式称为小端存储; 大小端验证一般采取指针或者共用体的方法进行验证,用指针变量指向存储多字节整数变量的地址,然后将指针强转为单字符指针类型的指针变量,打印强转后指针变量指向地址的数据便可以判断出大小端存储;共用体发原理相似,共用体共享同一片内存空间,在共用体中定义一个多字节整数变量和一个单字符变量,初始化共用体中的多字节整数变量后,打印单字符变量,以此来判断大小端存储。 大小端的转换多用与跨主机的通信,因为不同主机可能存在大小端异同,所以在跨主机的网络通信中,主机在对多字节整数进行处理时需要先转换成网络字节序再在网络中进行传输,在接收到网络中的多字节整数时需要先将其转换成主机字节序才能使用,网络字节序为大端存储。 |
| 什么是互斥锁 | 在多个任务对同一个临界资源进行访问时会出现资源争夺的竞态,造成错误,因此,引入互斥锁机制; 互斥锁本质上也是一个临界资源,当我们现需要对一个临界资源进行异步处理时可以定义一个互斥锁变量,当多个任务对同一临界资源进行争夺时,需要先争夺互斥锁资源,当申请到互斥锁资源后才可以对对应的临界资源进行访问,在结束使用临界资源时释放互斥锁资源; |
| 共享内存的特点 | 共享内存是System V提供的一种用于多进程通信的机制,其原理是在在内存中为进程映射一块物理内存,映射到此块物理内存的进程可以通过这块内存进行数据的交互; 共享内存具有高效率,避免了进程间通信时数据拷贝的开销 共享内存中的数据具有持久性,直到该块内存的数据被刷新; 多进程使用共享内存时也可能会出现竞态,因此通常使用同步机制如信号灯集来同步进程间的通信。 |
| 描述一下C语言中的指针 | 我们通常说的C语言指针指的是指针变量,指针指的是地址,指针变量是存储地址的变量,指针不可以变化,而指针变量可以变化; 指针变量有两个属性,一个是它存储的地址值,一个是它指向的数据类型,指针变量指向一块内存地址时,其偏移量为该指针定义时的给的数据类型; 指针的声明格式为type *var_name,其中type表示指针指向的数据类型,var_name是指针变量的名称。例如,int *ptr; 声明了一个指向整数类型的指针ptr; 指针的值即为一个内存地址,通常通过取地址运算符&来获取变量的地址并赋给指针。例如,int a = 10; int *pa = &a; 将整型变量a的地址存储在指针pa中; 使用解引用操作符*可以通过指针访问或修改其所指向地址的值。例如,执行*pa = 100; 可以将pa指向地址的值修改为100。 指针可以进行加减运算,这类运算是依据其所指向数据类型的大小进行的。例如,int *ptr; ptr+1;会使ptr的地址值增加sizeof(int)的字节数; 空指针和void指针。空指针用于表示一个指针不指向任何有效内存地址,而void指针是一种通用指针类型,可指向任何类型的数据; 数组名本质上就是一个指针常量,可以使用数组名对数组成员进行访问; 指针可以作为函数参数传递,使得函数能够修改传入的实际参数。同时,函数也可以返回指针类型的数据。 |
| gcc分布编译 | 预处理 gcc -E test.c -o test.i 编译 gcc -S test.i -o test.s 汇编 gcc -c test.s -o test.o 链接 gcc test.o -o test 生成 可执行文件test 预处理:展开头文件,替换宏定义,删除注释; 编译:检查语法问题,出现错误会报错,编译停止,没有错误会生成汇编文件; 汇编:生成一个不可执行的二进制文件; 链接:链接库函数将不可执行二进制文件生成可执行二进制文件。 |
| 说一下对套接字的理解 | 使用socket函数可以创建一个套接字文件,该函数返回一个文件描述符作为操作该文件的句柄,该文件里维护了两个缓冲区,一个数据的接受区,一个数据的发送区,可以实现全双工通信; 套接字文件多用于跨主机的网络通信中,例如在TCP和UDP中都使用了套接字; 套接字的的类型分为流式域套接字(TCP使用),数据报(UDP),和原套接字(允许直接访问底层协议(如IP或ICMP),用于特殊应用场景,比如网络协议的开发和底层网络操作); 接套字由IP地址、端口号和协议类型三部分组成; 套接字的通信流程: ①创建套接字 ②绑定操作 ③建立连接 ④数据传输 对于TCP,服务器端需要创建同于连接的套接字后开启监听,再监听到客户端的connect请求后使用accept创建用于通信的套接字,对于UDP,服务器端和客户端都只需要创建一个用于通信的套接字即可;TCP和UDP通信中,服务器端都必须要进行绑定,客户端没有强制要求。 |
| HTTP 和TCP、UDP的关系 | HTTP(超文本传输协议)是应用层的协议,一般使用TCP(传输控制协议)完成,TCP和UDP(用户数据报协议)是传输层的协议; HTTP是一种应用层协议,主要用于在Web浏览器和服务器之间传输网页和其他资源。它规定了客户端如何向服务器发送请求,以及服务器如何响应这些请求。由于HTTP需要可靠传输,确保数据完整无误地到达对方,因此它通常建立在TCP协议之上。TCP提供面向连接、可靠传输的服务,通过三次握手建立连接,四次挥手关闭连接,确保数据传输的可靠性和顺序性; UDP则是一种无连接的传输层协议,它不保证数据的可靠性和顺序性,但在某些应用场景下,如实时音视频传输、DNS查询等,对实时性要求高、能够容忍部分数据丢失的情况,UDP更适用。由于UDP的这些特性,HTTP一般不会直接使用UDP进行数据传输。不过,随着技术发展,有些特定情况下可能会研究基于TCP和UDP混合的HTTP协议,以优化特定场景下的传输性能。 |
| 如何使用IP地址和子网掩码得到你需要的网络的网段 | IP地址 & 子网掩码 得到需要的网络的网段 |
| 计算机网络中的OSI七层模型和TCP/IP的四层结构 | OSI七层模型是一个详细的网络通信协议分层标准,由国际标准化组织(ISO)制定。它包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层; TCP/IP四层结构是基于实际应用而发展起来的模型,包括应用层、传输层、网络层和网络接口层。与OSI模型相比,TCP/IP模型更为简洁,将表示层、会话层和部分传输层的功能融合到了应用层,把数据链路层和物理层合并为网络接口层。该模型广泛应用于互联网,成为事实上的国际标准。 |
| 数据结构中栈和队列的区别 | 栈和队列都是操作受限的线性表; 栈只允许对队列的一端进行操作,包括入栈和出栈操作, 队列只允许再两端进行不同的操作,一端入队,一端出队; 栈对数据的操作是先进后出(FILO),队列对数据的操作是先FIFO); |
| 顺序表和链表的区别 | |
| TCP/IP的三次握手和四次挥手 | |
| TCP/IP为什么是三次握手 | |
| 指针和指针变量 | |
| 共享内存和消息队列的优缺点 | |
| 结构体中一个char 一个int结构体占字节长度是多少 | |

相关推荐
小兔子酱#2 小时前
【Linux 29】传输层协议 - UDP
linux·运维·服务器·网络·网络协议·udp
不爱学习的YY酱2 小时前
【计网不挂科】计算机网络期末考试——【选择题&填空题&判断题&简述题】试卷(2)
网络·计算机网络
想不到好名字了()2 小时前
负载均衡式在线oj项目开发文档2(个人项目)
linux·网络·c++
liuhaoodng6262 小时前
浮动路由:实现出口线路的负载均衡冗余备份。
运维·网络·网络协议·负载均衡
生活的高手☆2 小时前
网络安全之信息收集
网络·安全
dot.Net安全矩阵3 小时前
.NET 黑名单上传 突破WAF防护的SoapShell (免杀版)
服务器·网络·学习·安全·web安全·.net
follycat3 小时前
[极客大挑战 2019]Upload 1
网络·网络协议·学习·http·网络安全
follycat3 小时前
[极客大挑战 2019]Secret File 1
网络·学习·网络安全
不喝水的鱼儿6 小时前
【LuatOS】基于WebSocket的同步请求框架
网络·websocket·网络协议·go·luatos·lua5.4