1> OIS 7层模型 TCP/IP 4层模型 5层模型
传输层:提供端到端的可靠传输,指定哪个进程哪个发送进程接收 第四层
网络层:寻址和路由选择 第三层
3>MAC地址:
a. IP地址变不变,MAC地址变不变
IP地址改变,IP地址由路由器下发
MAC地址不改变
b. ARP RARP协议功能
ARP(Address Resolution Protocol):通过ip地址获取其对应的mac地址。
RARP(Reverse Address Resolution Protocol):通过mac地址获取其对应的ip地址。
4> 限制数据包大小的协议?
限制数据包大小的协议为:MTU MSS
MTU : Maximum Transmission Unit 最大传输单元。物理接口(数据链路层)提供给上层(网络层(IP层))最大一次传输数据的大小。
MSS :Maximum Segment Size 最大报文长度。TCP提交给IP层最大分段大小,指TCP报文所允许传送数据部分最大长度。
5> TCP和UDP的异同点
相同点:同属于传输层的协议。
TCP协议
1> 提供面向连接的,可靠的数据传输服务
2> 数据无误,数据无丢失,数据无失序,数据无重复到达的通信。
3> 传输效率低,耗费资源多
4> 数据的发送和接收是不同步的,存在粘包现象。(不存在数据边界)
5> 适用场景:对于传输质量要求比较高,以及传输大量数据通信的情况。
UDP协议
1> 无连接的,不可靠的,尽力的传输协议。
2> 不能保证数据的可靠性,数据有可能在传输过程中丢失,或者出现失序或者重复到达的情况。
3> 传输效率高,
4> 限制每次传输的数据大小,超出部分直接删除。
5> 数据的发送和接收是同步的。(不会粘包)
6> 适用场景:适用于发送小尺寸的数据,在接收到数据包给出应答比较困难的网络中使用。
6> IP分类,分成2类,分别是什么,占几个字节?
IPv4:本质上是4个字节,32位的无符号整数。
IPv6:本质上是16个字节,128位无符号整数,IPv4和IPv6不兼容。
7> IP划分?分成几类?其中哪几类可以分配给主机使用,D类,E类作用。
ABC类为基本类,他们用于主机地址,分配给主机使用。
D类:不表示网络,用于特殊用途,组播(多播)。
E类:保留今后使用,或者实验室使用。
a. 特殊IP地址:网络地址,广播地址
网络地址:有效网络号+全是0的主机号,代表该网络。
广播地址:有效网络号+全是1的主机号,向该IP地址发送数据代表想该网络环境中的所有主机发送数据。
b. 每一类的主机号是多少个,可用主机号是多少个
A类地址:主机号2^24 可用主机号2^24-2
B类地址:主机号2^16 可用主机号2^16-2
C类地址:主机号2^8 可用主机号2^8-2
8> 子网掩码
a. 默认子网掩码是什么
格式:与IP地址一样长的32位无符号整数,由一串连续的1后面跟着一串连续的0组成。
默认情况下1的个数与IP地址中网络号的个数一致
默认情况下0的个数与IP地址中主机号的个数一致。
b. 给定IP地址,给定子网网段个数,会计算子网掩码
例:192.168.1.0,要划分出4个子网网段,求子网掩码?255.255.255.192 2^6=64个,可用64-2个
例:130.1.2.3,要划分出4个子网网段,求子网掩码?255.255.192.0 2^14 ,可用2^14-2个
c. 给定IP地址,给定子网掩码,计算子网网段个数,每个子网网段中主机号个数,可用主机号个数。
子网网段的个数 = 2^ (子网号中1的个数)
每个子网网段中主机号的个数 = 2^ (子网掩码中0的个数)
可用主机号个数=主机号的个数-2
9> 字节序
简述字节序的概念,并用共用体(联合体)的方式计算本机是大端还是小端
1> 字节序是指不同类型CPU主机,内存存储 多字节整数 序列的方式。
2> 小端字节序:低序字节存储在低地址上
3> 大端字节序:低序字节存储在高地址上
11> TCP中的send能否替换成其他(sendto write)。recv能否替换成其他(recvfrom read)。
当flags填0的时候,send完全等价于write.
所以send函数可以用write函数替换。
send(sockfd, buf, len, flags);
等价于sendto(sockfd, buf, len, flags, NULL, 0);
所以send函数可以用sendto函数替换。
当flags填0的时候,recv完全等价于read.
所以recv函数可以用read函数替换。
recv(sockfd, buf, len, flags);
等价于 recvfrom(sockfd, buf, len, flags, NULL, NULL);
所以recv函数可以用recvfrom函数替换
12> UDP中的sendto能否替换成其他(send write)。recvfrom能否替换成其他(recv read)。
recv(sockfd, buf, len, flags);
等价于 recvfrom(sockfd, buf, len, flags, NULL, NULL);
所以UDP中的recvfrom可以用recv替换,
当flags填0的时候,recv完全等价于read. 所以recv函数可以用read函数替换。
send(sockfd, buf, len, flags);
等价于sendto(sockfd, buf, len, flags, NULL, 0);
13> UDP中的connect,与TCP中的connect的区别
1. udp中也可以使用connect函数
TCP中的connect函数会连接服务器,产生三次握手,将服务器和客户端连接起来。
UDP中的connect不会产生连接,仅仅是将对端的IP和端口号记录到内核套接字中。此时UDP只能与记录的对端进行通信
2. TCP中的connect函数只能成功一次,代表连接服务器
UDP中的connect函数可以被调用多次,刷新内核中对端的IP和端口。
若想要清空内核中对端的地址信息,则将sin_family = AF_UNSPEC.
3. 当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多路复用分类,请简述其中一种的原理。
16> 以太网头的协议类型:
0X0800 只接收发往本机的mac的ip类型的数据帧
0X0806 只接收发往本机的ARP类型的数据帧
0x8035 只接受发往本机的RARP类型的数据帧
0X0003 接收发往本机的MAC所有类型:ip,arp,rarp数据帧,接收从本机发出去的数据帧,混杂模式打开的情况下,会接收到非发往本地的MAC数据帧
17> 与分包(将数据包分成数据帧)相关的包头:
例: a. 以太网头 b. IP头 C.TCP头 D.UDP头
18> TCP头中有:端口号 序列号 应答号
a. SYN FIN PSH ACK
b. SYN FIN: ack = seq+1;
c. PSH: ack=seq+len;
19> 三次握手,四次挥手
a. 请简述三次握手,四次挥手流程。
b. 请简述TCP建立连接,断开连接的过程。(三次握手,四次挥手)
c. 请简述UDP通信与TCP通信过程中的区别?(三次握手,四次挥手,有无应答)
d. 请用简述如何用UDP模型实现TCP式传输?(与第c题一致,三次握手,四次挥手,有无应答)
第一次握手:客户端发送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> UDP如何能够让本端知道对端掉线。
a.心跳包机制,客户端每隔一定时间给对端发送一个心跳包,对端给客户端发送一个应答,刷新对端的状态。