1. OSI 7层模型 4层模型 5层模型
七层:应用层 表示层 会话层 传输层 网络层 数据链路层 物理层
四层:应用层 传输层 网络层 网络接口和物理层
五层:应用层 传输层 网络层 数据链路层 物理层
2. 传输层的功能,网络层功能
传输层:负责提供应用程序之间通讯服务,这种服务又称之为端到端。
网络层:负责在主机之间的通讯中选择数据包传输的路径,即选择路由。
3. MAC : 改变网络环境后 IP 和MAC变不变
改变网络环境后IP会改变,MAC地址不变
3. ARP RARP : 网络接口和物理层 数据链路层
ARP:通过ip地址获取其对应的mac地址。
RARP:通过mac地址获取其对应的ip地址。
4. IP协议:路由器工作在哪一层 ICMP IGMP
IP协议工作在网络层;
ICMP:英特网控制管理协议,ping检测网络就是用这个协议,用于在IP主机、路由器之间传递控制消息。
IGMP:英特网分组管理协议,组播,广播。
5. TCP UDP 相同点和不同点
TCP: >TCP是面向连接的可靠传输
>该协议能保证数据无误,数据无丢失,数据无失序,数据无重复到达。
>传输效率低,耗费资源多
>数据的收发是不同的,不存在数据边界。
TCP的适用场景:适用于对传输质量比较高,以及传输大量数据的通信。在需要可靠数据传输的场合,通常使用TCP协议。
UDP:>UDP是面向无连接的不可靠,且快速的传输
>数据不保证可靠,数据有可能在传输过程中丢失,或者出现数据重复、失序等情况
>由于UDP无应答,所以UDP传输效率高
>限制每次传输的数据大小
>数据的收发是同步的,数据不会粘包
UDP的适用场景:适用于对传输质量比较低,以及传输小尺寸数据。在需要强求实时性的场景下或者给出应答比较苦难的情况下。
6. IP分类,IP划分(ABC类为基本类):有公司需要入网255台电脑,问应该选择哪一类IP地址。网络地址, 广播地址
IP地址分为IPv4和IPv6,IPv4占4个字节,采用32位无符号整数存储,2^32.
IPv6占16个字节,采用128位无符号整数。(IPv4和IPv6不兼容)
IP地址划分: 网络号 主机号
A类:0.0.0.0 ~127.255.255.255 2^7 2^24
B类:128.0.0.0~191.255.255.255 2^14 2^16
C类:192.0.0.0~223.255.255.255 2^21 2^8
D类:224.0.0.0~239.255.255.255 组播IP
E类:240.0.0.0~255.255.255.255 保留,或实验室使用
ABC类是基本类,他们用于主机地址,只有ABC类可以分配给主机使用
D类不表示网络,用于特殊用户,组播
E类保留今后使用
如果要录入255台电脑可以选用B类和A类IP地址,C类Ip地址最大只能供给253台电脑,剩下的2台电脑需要换个网络号,因为可用的IP地址需要除去网络地址和广播地址,这俩个不能给主机分配使用。
网络地址:有效网络号+全是0的主机号---->代表整个网络
192.168.31.58 --->所属网络地址 192.168.31.0
广播地址:有效网络号+全是1的主机号 --->代表向当前网络所在的所有主机发送信息;
192.168.31.58 --->所属广播地址 192.168.31.255
7. 子网掩码:默认子网掩码。给定网段,计算子网掩码,主机个数
与IP地址一样长的32bit无符号整数,由一串 连续 的1,后面跟着一串 连续 的0组成。
默认情况下,1的个数与IP地址中网络号的bit个数一致。
默认情况下,0的个数与IP地址中主机号的bit个数一致。
每个子网网段中,主机号的个数 = 2^(子网掩码中0的个数)
可用主机号需要去掉网络号和广播号
子网网段个数 = 2^(子网号1的个数)
8. 字节序:请简述字节序的概念,并用联合体的方式判断主机的大小端。
>字节序是计算机存储 多字节整数 序列的方式
>例如:short int long longlong 类型,就需要主机字节序
>char单字节,float double浮点类型,字符串以上均没有字节序的说法。
>小端字节序:低序字节存储在低地址上
>大端字节序:高序字节存储在低地址上
>计算机的内存读取:都是从低地址往高地址读取的,然后通过大小端转换得出读取到的结果。
>用联合体(共用体)的方式判断主机的大小端
定义一个共用体里面存有int类型和char类型,先用int类型存一个0x87654321,再用char类型输出,若输出为0x21则为小端字节序,若为0x87则为大端字节序
9.TCP基础模型 UDP基础模型
TCP模型
服务器 客户端
↓ ↓
启动 启动
↓ ↓
创建套接字(socket) 创建套接字(socket)
↓ ↓
必须绑定服务 非必须绑定服务器
器的IP和端口(bind) 的IP和端口(bind)
↓ ↓
将套接字设定为被动 ↓
监听状态(listen) ↓
↓←←← ←←← ←←← ←←← ←← 连接服务器(connect)
获取连接成功后的 ↓
套接字(accept) ↓
↓ ↓
接收客户端的信息(recv) ← ←←← ←←← ← 发送信息给服务器(send)
↓ ↓
发送信息给客户端(send) →→→→→→→→→ 接收服务器的信息(recv)
↓ ↓
关闭套接字(close) 关闭套接字(close)
UDP模型
服务器 客户端
↓ ↓
启动 启动
↓ ↓
创建套接字(socket) 创建套接字(socket)
↓ ↓
必须绑定服务 非必须绑定服务器
器的IP和端口(bind) 的IP和端口(bind)
↓ ↓
接收客户端的信息(recvfrom) ← ←←← ←←←发送信息给服务器(sendto)
↓ ↓
发送信息给客户端(sendto) →→→→→→→→ 接收服务器的信息(recvfrom)
↓ ↓
关闭套接字(close) 关闭套接字(close)
10.send sendto write. recv recvfrom read相互替换问题。
TCP中的send、write、sendto可以随意替换
TCP中的recv、read、recvfrom可以随意替换
UDP中使用connect函数连接后可以使用send和write函数,上述函数可以相互替换,只不过需要转换一下形式,如果不调用connect则不能相互替换。
11.UDP中的connect函数,与TCP中的有什么区别
TCP的connect函数会造成三次握手,将客户端与服务器连接,UDP中的connect仅仅是将对端的IP和端口记录到内核中,此时UDP只能与记录的对端进行通信。
TCP中的connect只能调用一次,UDP中的connect可以调用多次,刷新内核中存储的IP和端口。
12.广播IP, 组播IP. 特点:只能用于局域网内通信。 单播,广播,组播的区别
单播:主机之间一对一的通信,交换机及路由器只对数据进行转发,不复制,每次只有两个实体相互通信,接收端和发送端都是确定的。
组播:主机之间一对一组的通信,同网段下的主机都可以收到组内所有主机的信息。
广播:主机之间一对所有的通信,网络中对同一个局域网下的主机的信息都进行无条件的复制并转发,所有主机都能收到信息。
13. 并发服务器模型:多进程、多线程。
多进程:
void recoverFork(int sig){
while(waitpid(-1, NULL, WNOHANG) > 0);
}
signal(17, recoverFork);
sfd = socket();
bind();
listen();
while(1){
newfd = accept();
if(0 == fork()){
close(sfd);
recv();
send();
close(newfd);
exit(0);
}
close(newfd);
}
close(sfd);
多线程:
sfd = socket();
bind();
listen();
while(1){
newfd = accept();
pthread_create(); -->callBack();
pthread_detach(tid);
}
close(sfd);
void *callBack(void *arg){
参数另存
recv();
send();
close(newfd);
pthread_exit(NULL);
}
14. select TCP服务器模型
15. 请简述IO多路复用方式有哪些:
select函数:让内核监测,集合中是否有文件描述符准备就绪,当集合中的文件描述符有数据可读的时候,select就会解除阻塞。
poll函数:让内核监测,集合中是否有文件描述符准备就绪,当集合中的文件描述符有数据可读的时候,poll就会解除阻塞。
16. 以太网头中有哪些内容,IP头:拆包用的,IP地址 TCP头:端口号 seq ack
以太网头有14个字节,分别是目的mac地址,源mac地址,类型,分别占6字节,6字节,2字节。
IP头:IP头中用于拆包的福分:id flags fregment_offset
两个IP地址:源IP,目的IP地址
TTL:指定数据帧可以最多经过几个路由器,当数据帧被目标方接收后,TTL清除为0.
Linux TTL:64, Windows:TTL 128
TCP头:
Seq:序列号,用于给数据进行编号
Ack:应答号,用于应答非应答包。
SYN:握手包,连接的时候产生的包。
FIN:挥手包,断开链接的包。
PSH:数据包。
ACK:应答包
PSH Ack = Seq + len;
SYN FIN Ack = Seq + 1;
17. 三次握手四次挥手
请简述TCP服务器客户端建立连接,断开连接的过程。
请简述TCP和UDP在通信过程中有什么区别? (三次握手 有无应答 四次挥手)
请简述如何用UDP模型实现TCP式传输。 (与b相同)。
18. UDP中如何知道对端是否掉线?
心跳包机制,每隔固定的时间给对端发送一个心跳包,等待对方回复应答。
若没有回复应答,或者没有收到心跳包,重复多次后。可以认为对端掉线。
19. 静态库和动态库的区别
静态库封装函数是在程序编译到链接库步骤的时候将函数继承到可执行程序中,内存中会存在多余的静态库。
动态库把库函数的链接步骤推迟到程序运行的时候,当程序执行到库函数的时候,会去动态库找函数。内存中只会存在一份动态库函数。