一、抓包分析
二、HTTP服务器
三、动态库与静态库
四、一些面试题
- 指针数组和数组指针的区别:指针数组本质是一个数组,只是数组中存储的是指针变量。数组指针存储的是该数组的起始地址,对该指针来说每偏移一个单位就是偏移了一整个数组的地址
- 结构体字节对齐:1、结构体中每个成员,分配内存时要从上到下按顺序数据类型对齐一次 2、成员分配内存结束后要整体对齐一起,32位系统中,4对齐;64位系统中,8对齐
- TCP和UDP的区别:1、TCP是稳定的面向链接的传输协议,其中每次收发都需要应答包应答。其效率较低浪费资源较多,收发不同步,会出现沾包现象:即在发送间隔较短数据较小的数据包可能会沾在一起发送。一般TCP使用在需要高质量传输或需要可靠通信的传输场合 2、UDP传输:是一种面向无连接的不稳定的尽最大努力传输的传输协议,其传输效率高,实时性强,且收发同步不会沾包。但由于是无连接的传输,不稳定可能会出现数据丢失、数据重复、数据失序等情况。同时UDP传输会限制每次的传输大小,多出部分直接忽略。常用于:广播,组播中
- 同步通信和异步通信的区别:
- 对多线程的理解:多线程是进程的轻量版,可以同时处理多个任务,在linux中使用多线程相关函数时需要引进线程相关支持库。一般一个进程中至少有一个线程。由于多线程是在一个进程下进行时可以同时使用一个进程的共享资源即临界资源,而多个线程同时访问临界资源会出现竞态,所以引入了同步互斥的概念来解决竞态问题。互斥是指同一时刻只能有一个任务,如互斥锁,同步是指多个任务有先后顺序的执行,如无名变量、条件变量。(后面继续可补充几种多线程间通信的具体讲解)
- 互斥锁:完成线程互斥的方式,互斥锁本质上是一种特殊的临界资源,该临界资源在同一时刻只能被一个线程所拥有,当另一线程想拥有已经被某线程拥有的互斥锁时会被阻塞,知道某线程解锁互斥锁。互斥锁中会出现死锁的现象,原因是1、资源不能被多个线程共享。2、一个线程即持有一个资源也在等待另一个线程所持有的资源,这是持有和等待。3、互斥锁这一临界资源不能强制抢占。4、某线程集合中,每个线程都在等待下一线程中的资源。为防止死锁现象的出现,在编译时要注意避免持有和等待,并进行一个获取资源的顺序规定,这里常用到条件变量,并设置超时机制。在运行前要进行对死锁问题的相关检查。
- 大小端验证:cpu架构不同导致多字节整数的存储方式不同,大致分为大端存储和小端存储。一般使用指针或共用体进行验证。网络字节序中是大端存储,但主机字节序中需要根据主机架构区别,所以在传输过程中需要进行主机字节序和网络字节序的相互转换。
- Gcc四步编译:gcc四步编译是:预处理、编译、汇编、连接。预处理中进行条件编译的处理、头文件的展开等,编译中对程序进行语法语义上的分析,生成汇编程序,汇编中将汇编程序生成一个二进制目标程序,连接过程中将目标程序与相关库进行连接,生成一个可执行程序
- Socket:套接字函数,用于tcp传输协议和udp传输协议中,创建一个套接字文件来完成网络通信中的数据收发操作
- http协议和tcp协议、udp协议间的关系:http协议全称超文本传输协议,是一种用于在万维网中传输html文件的传输协议,属于应用层协议。tcp协议,udp协议都是传输层协议。其中http协议使用的是tcp协议。
- Ip地址和子网掩码如何决定网卡所在的网段:子网掩码和ip地址同时使用,通过ip地址&子网掩码得到网段。
- OSI七层模型、TCP\IP四层: 物数网传会表应、网络接口层,网络层,运输层,应用层
- 栈和队列的区别:栈和队列都是操作受限的线性表。栈的插入和删除只允许在同一端进行操作,有先进后出的特点。队列的插入和删除必须在异端进行,有先进先出的特点。队列一般就是指顺序队列,为解决假溢满现象,常使用的时循环顺序队列
- 顺序表和链表的区别:顺序表和链表都是线性表,顺序表采用物理内存连续的存储方式,可以直接通过下标定位元素,但插入和删除时需要移动大量元素且存储数据有上限。链表的存储地址不一定连续,但存储无上限且可以在任意位置中间插入元素。但进行查找时必须从头一个一个查找比较麻烦。
- 三次握手和四次挥手:1、三次握手:一定是客户端发起的。第一次握手:客户端向服务端发送一个SYN握手包,并进入syn_sent状态。第二次握手:服务器端接收到来自客户端的SYN握手包后,进入syn_rcvd状态,向客户端发送一个SYN握手包和一个ACK应答包。第三次握手:客户端收到服务器端的SYN握手包和ACK应答包后进入establish状态,并向服务器端发送一个ACK应答包,服务器也进入establish状态。2、四次挥手:可以是服务器发起也可以是客户端发起。第一次挥手:主动方向被动方发送一个FIN挥手包并进入FIN_WAIT_1状态。第二次挥手:被动方向主动方发送一个ACK应答包,并进入CLOKSE_WAIT状态(该状态下如果数据还没有传输完毕可以继续传输),当主动方受到ACK应答包后进入FIN_WAIT_2状态。第三次挥手:数据发送完毕后,被动方发送一个FIN挥手包并进入LAST_ACK状态。第四次挥手:主动方收到了FIN挥手包向被动方发送一个ACK应答包,被动方收到应答包后关闭连接。
- 指针和指针变量分别是指什么:指针是指存储某数据的内存地址编号,通过指针可以以地址的角度找到内存中的数据。指针变量时指指针存储地址,是一个特殊的数据类型,大小为8字节。通常我们将指针变量简称为指针。
- 共享内存和消息队列的优缺点:共享内存和消息队列都是进程间的IPC通信方式。消息队列通过在内核空间维护一个队列,消息队列中的消息不会消失,但是存取必须遵循先进先出原则。共享内存是通过多进程共享一个外部的物理内存来完成多进程间通信的。效率较高,但具有时效性,共享内存中的内存会被下一次传入的数据覆盖。