网络编程重点

1> OIS 7层模型 TCP/IP 4层模型 5层模型

网络编程重点_第1张图片
2> 传输层的功能 网络层的功能?以及分别是第几层

传输层:提供端到端的可靠传输,指定哪个进程哪个发送进程接收 第四层
网络层:寻址和路由选择 第三层

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> 大端字节序:低序字节存储在高地址上

10> TCP的API流程,UDP的API流程
网络编程重点_第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函数后面参数填NULL0

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多路复用分类,请简述其中一种的原理。

select、poll、epoll

网络编程重点_第4张图片

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. 请简述三次握手,四次挥手流程。
网络编程重点_第5张图片
网络编程重点_第6张图片

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.心跳包机制,客户端每隔一定时间给对端发送一个心跳包,对端给客户端发送一个应答,刷新对端的状态。

你可能感兴趣的:(网络,tcp/ip,udp)