1>OIS 7层模型
用户空间:应用层 7>提供各种网络接口
表示层 6>数据表示,加密与压缩
会话层 5>主机之间会话管理
内核空间:传输层 4>控制哪个进程发送哪个接受
网络层 3>寻址和路由选择
数据链路层 2>相邻节点可靠传输
物理层 1>二进制比特传输
TCP/IP 4层模型
用户空间:应用层
内核空间:传输层
网络层
网络接口和物理层
TCP/IP 5层模型
用户空间:应用层
内核空间:传输层
网络层
数据链路层
物理层
2>传输层的功能、网络层的功能?以及分别是第几层
传输层:第四层,提供端对端的接口
网络层:第三层,为数据包选择路由
3>MAC地址:
a.IP地址变不变,MAC地址变不变
切换网络,IP地址改变,MAC地址不改变
b.ARP RARP协议功能
ARP:通过ip地址获取其对应的mac地址。
RARP:通过mac地址获取其对应的ip地址
4>限制数据包大小的协议?
MTU和MSS协议
5>TCP和UDP的异同点
TCP协议
提供面向连接的,可靠的数据传输服务
数据无误,数据无丢失,数据无失序,数据无重复到达的通信。
序列号:每一个数据包都会编上一个编号,该编号称之为序列号,且每一个序列号都需要应答包应答。
应答包:应答序列号的。
传输效率低,耗费资源多
数据的发送和接收是不同步的,存在粘包现象。(不存在数据边界)
由于TCP效率比较低,所以将多个足够小,且发送间隔短的数据包沾成一个包发送。该算法称之为nagle算法
UDP
无连接的,不可靠的,尽力的传输协议。
不能保证数据的可靠性,数据有可能在传输过程中丢失,或者出现失序或者重复到达的情况。
传输效率高,
限制每次传输的数据大小,超出部分直接删除。
数据的发送和接收是同步的。(不会粘包)
6>IP分类,分成2类,分别是什么,占几个字节?
IPv4:本质上是4个字节,32位的无符号整数
IPv6:本质上是16个字节,128位无符号整数
7>IP划分?分成几类?其中哪几类可以分配给主机使用,D类,E类作用。
a.特殊IP地址:网络地址,广播地址
b.每—类的主机号是多少个,可用主机号是多少个
8>子网掩码
a.默认子网掩码是什么
b.给定IP地址,给定子网网段个数,会计算子网掩码
c.给定IP地址,给定子网掩码,计算子网网段个数,每个子网网段中主机号个数,可用主机号个数。
C类IP地址的默认子网掩码:11111111 11111111 11111111 00000000 ==》 255.255.255.0
B类IP地址的默认子网掩码:11111111 11111111 00000000 00000000 ==》 255.255.0.0
A类IP地址的默认子网掩码:11111111 00000000 00000000 00000000 ==》 255.0.0.0
D类和E类没有子网掩码!!!!!
9>字节序
简述字节序的概念,并用共用体(联合体)的方式计算本机是大端还是小端
#include <stdio.h>
union t
{
unsigned int a;
char b;
};
int main(int argc, const char *argv[])
{
union t x;
x.a = 1;
printf("%#x\n", x.b);
if(0x01 == x.b)
{
printf("little-endian\n");
}
else
{
printf("big-endian\n");
}
return 0;
10>TCP的API流程,UDP的API流程
TCP:socket,bind,listen,accept,recv,send,connect
UDP:socket,bind,recvfrom,sendto
11>TCP中的send能否替换成其他(sendto write)recv能否替换成其他(recvfrom read)
12>UDP中的sendto能否替换成其他(send write)。recvfrom能否替换成其他(recv read)
13>UDP中的connect,与TCP中的connect的区别
TCP中的connect函数会连接服务器,产生三次握手,将服务器和客户端连接起来。
UDP中的connect不会产生连接,仅仅是将对端的IP和端口号记录到内核套接字中。此时UDP只能与记录的对端进行通信
TCP中的connect函数只能成功一次,代表连接服务器
UDP中的connect函数可以被调用多次,刷新内核中对端的IP和端口。若想要清空内核中对端的地址信息,则将sin_family = AF_UNSPEC.
当udp采用connect的方式收发报文后,可将将recvfrom后面的参数填NULL,sendto函数后面参数填NULL和0;
14>TCP多进程并发服务器模型,多线程并发服务器模型。
void handler(int sig){
while(waitpid(-1, NULL, WNOHANG) > 0);
}
signal(17, handler);
sfd = socket();
bind();
listen();
while(1){
newfd = accept();
if(fork() == 0){
close(sfd);
while(1){
recv();
send();
}
close(newfd);
exit(0); //必须退出子进程
}
close(newfd);
}
close(sfd);
sfd = socket();
bind();
listen();
while(1){
newfd = accept();
pthread_create(&tid, NULL, deal_cli_msg, &info);
pthread_detach();
}
close(sfd);
void* deal_cli_msg(void* arg)
{
int newfd = arg->newfd;
struct sockaddr_in cin = arg->cin;
while(1)
{
recv();
send();
}
close(newfd);
}
15>IO多路复用分类,请简述其中一种的原理
- 进程中如果同时需要处理多路输入输出流,在使用单进程单线程的情况下,同时处理多个输入输出请求。
- 在无法用多进程多线程,可以选择用IO多路复用;
- 由于不需要创建新的进程和线程,减少系统的资源开销,减少上下文切换的次数。
- 上下文:运行一个进程所需要的所有资源
- 上下文切换:从A进程切换到B进程,A进程的资源要完全替换成B进程的,是一个耗时操作。
- 允许同时对多个IO进行操作,内核一旦发现进程执行一个或多个IO事件,会通知该进程。
16>以太网头的协议类型
- 0X0800 只接收发往本机的mac的ip类型的数据帧
- 0X0806 只接收发往本机的ARP类型的数据帧
- 0x8035 只接受发往本机的RARP类型的数据帧
- 0X0003 接收发往本机的MAC所有类型:ip,arp,rarp数据帧,接收从本机发出去的数据帧,混杂模式打开的情况下,会接收到非发往本地的MAC数据帧
17>与分包(将数据包分成数据帧)相关的包头:
以太网头 b. IP头 C.TCP头 D.UDP头
18>TCP头中有:端口号 序列号 应答号
SYN FIN PSH ACK
SYN FIN: ack = seq+1;
PSH: ack=seq+len;
19>三次握手,四次挥手
- 第一次握手:客户端发送SYN包(SYN=1, seq=0)给服务器,并进入SYN_SENT状态,等待服务器返回确认包。
- 第二次握手:服务器接收到SYN包,确认客户端的SYN,发送ACK包(ACK=1 , ack=1),同时发送一个SYN包(SYN=1, seq=0),并进入SYN_RCVD状态。
- 第三次握手:客户端接收到服务器的SYN包,以及ACK包,进入establish状态,同时向服务器发送ACK包(ACK=1, ack=1)。此时三次握手包发送完毕,服务器也进入establish状态
- 第一次挥手,主动关闭方发送一个FIN包(FIN=1, seq = u)给被动方,进入FIN_WAIT_1状态;
- 第二次挥手:被动方接收到FIN包,给主动方发送一个ACK包(ACK=1, ack=u+1);并进入CLOKSE_WAIT状态。主动方接受到ACK包后,进入FIN_WAIT_2状态。如果有数据没有发送完毕,则继续发送,直到发送完毕为止;
- 第三次挥手:被动方发送一个FIN包(FIN=1, seq=w),进入LAST_ACK状态.
- 第四次挥手:主动关闭方收到FIN包,回复一个ACK包(ACK=1, ack=w+1)。被动关闭方收到主动关闭方的ACK后关闭连接。
20>请简述TCP UDP的API流程
21>UDP如何能够让本端知道对端掉线。
心跳包机制,客户端每隔一定时间给对端发送一个心跳包,对端给客户端发送一个应答,刷新对端的状态