一、计算机网络
1.网络体系结构分几层
(1) OSI的七层协议模型
OSI七层协议分别是:应用层(Application)、表示层(Presentation)、会话层(Session)、运输层(Transport)、网络层(Network)、数据链路层(Data Link)、物理层(Physical)
(2)TCP/IP四层协议模型
TCP/IP四层协议分别为:应用层、传输层、网络层、链路层
(3)五层协议模型
五层协议模型分别是:应用层、传输层、网络层、数据链路层、物理层
2.TCP协议与UDP协议的区别
1、TCP是面向连接的,而UDP是面向无连接;
2、对系统资源的要求(TCP较多,UDP少);
3、UDP程序结构较简单;
4、TCP面向字节流模式与UDP是面向数据报模式 ;
5、TCP保证数据正确性,UDP可能丢包,TCP是可靠的传输;
6、TCP保证数据顺序,UDP不保证。
3.IP地址分类有哪些?
IP地址分为五大类:A类、B类、C类、D类、E类;前三类A、B、C类为Internet NIC在全球范围内统一分配,D、E类为特殊地址。
类别 最大网络数 IP地址范围 单个网段最大主机数 私有IP地址范围
A 126(2^7-2) 1.0.0.1-127.255.255.254 16777214 10.0.0.0-10.255.255.255
B 16384(2^14) 128.0.0.1-191.255.255.254 65534 172.16.0.0-172.31.255.255
C 2097152(2^21) 192.0.0.1-22 3.255.255.254 254 192.168.0.0-192.168.255.255
D类IP地址第一个字节以"1110"开始,它是专门保留的地址,又叫做多播地址,即组播地址。在以太网中,多播地址命名了一组应该在这个网络中应用接收到一个分组的站点。多播地址的最高位必须是“1110”,范围从224.0.0.0到239.255.255.255。
E类IP地址是以“1111”开始,他的第一字节的范围是240~255,为将来使用保留。其中240.0.0.0~255.255.255.254作为保留地址,255.255.255.255作为广播地址。
4.三次握手的过程
所谓三次握手,即建立TCP连接,语言客户端与服务器端发送三次包的过程来确认连接的建立。
(1)第一次握手,客户端Client将标志位SYN置1,seq序号随机产生一个数值J,将syn包发送给服务器端Server,进入SYN_SENT状态。
(2)第二次握手,服务器接收到客户端的SYN=1即知道客户端需要建立连接,将SYN和ACK都置为1,ack=J+1,seq序号随机产生K。然后打包发送给客户端,进入SYN_RCVD状态。
(3)第三次握手,客户端接收到服务器端的确认信息后,检查ack是否为J+1,ACK是否为1。如果正确,则将ACK置为1,ack置位K+1,打包发送给服务器端。服务器接收到后,确认ACK和ack正确后,服务器与客户端即建立连接。
二、数据结构
1.数据结构有哪些算法?
基本操作:栈,队列,链表,树。
排序算法:快速排序,堆排序,归并排序,简单排序(冒泡排序,插入排序,选择排序)
搜索算法:二分搜索算法(已排序),深度优先,广度有限。以及使用Hash表,剪枝进行优化。
基本算法的思想应该有:1、回溯2、递归3、贪心4、动态规划5、分治
2.快排怎样实现的(引用自“李小白~”)
void Quick_Sort(int *arr, int begin, int end){
if(begin > end)
return;
int tmp = arr[begin];
int i = begin;
int j = end;
while(i != j){
while(arr[j] >= tmp && j > i)
j--;
while(arr[i] <= tmp && j > i)
i++;
if(j > i){
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
arr[begin] = arr[i];
arr[i] = tmp;
Quick_Sort(arr, begin, i-1);
Quick_Sort(arr, i+1, end);
}
3.栈和队列的区别?
队列和栈是两种重要的线性结构,从数据结构看,也是操作受限的线性表。
队列是一种先进先出(FIFO)的的数据结构,只允许在一端进行插入操作,另一端进行删除操作。
具体应用:舞伴问题,银行排队模拟
栈是一种先进后出(FILO)的数据结构,只能在一端(栈顶)进行插入删除操作。
具体应用:递归,数值转换,四则运算表达式求值,括号匹配问题
三、C语言相关知识点
1.联合体与结构体区别
结构体struct:各成员各自拥有自己的内存,各自使用互不影响。结构体内遵循内存对齐原则,一个struct变量的总长度等于各成员长度之和。
联合体union:各成员共用一块内存空间,并且同时只有一个成员拥有使用权,也就是读写权,各变量共同拥有一个首地址。因而,联合体比结构体更节约内存。一个union变量的总长度至少能容纳最大的成员变量,而且要满足是所有成员变量类型大小的整数倍。
2.static定义的函数与普通函数差异
当使用static声明的函数,它的使用权限仅限于当前源文件当中,不能被除当前源文件以外的其他代码文件所调用。而普通函数默认是extern 的,可以被其他源文件所调用。
优点:其他源文件可以定义相同函数名的函数,而不会发生冲突。静态函数不会被其他源文件所调用。
3.动态地址如何实现?
C语言的地址分配可以使用malloc()实现,malloc会向堆中申请一块内存块,若申请成功则返回该块开头的指针,否则返回空指针NULL;因为返回值为void *,需要强制转换(int *)为我们需要的类型。如果申请的size大小为0,这是未定义的,可能为空也可能不为空,取决于编译器。
int *p = NULL;
int n = 50;//此处n可以改成由用户输入任意数字
p = (int *)malloc(sizeof(int)*n);
if(p == NULL)
return;
使用malloc申请的地址使用完之后需要进行释放,如果不手动释放则会在程序执行完之后才释放地址,可能会导致内存泄露,所以未使用的地址需要手动释放
free(p);
4.函数指针如何实现
函数指针:在程序中定义了一个函数,编译时则这个函数将会存放在一块连续的内存空间中,函数名指向了该空间的首地址,定义一个指针变量存放该地址即函数指针。
函数指针定义如下
函数返回值类型 (* 指针变量名) (函数参数列表);
如何使用函数指针调用函数?举例说明一下
int max(int, int);//声明函数
int (*p)(int,int);//定义函数指针
p = max;//将函数地址赋值给函数指针p