网络编程重点内容

本文介绍了网络通信的基础知识,包括OSI七层模型和TCP/IP四层模型,强调了TCP与UDP的区别,如TCP的可靠传输和UDP的高效但不可靠特性。此外,讨论了常见网络协议的作用,如MAC、IP、ARP、RARP等,并详细阐述了IP地址的分类和子网掩码的应用。还涉及了字节序在不同主机间的重要性,以及TCP的三次握手和四次挥手过程。最后提到了UDP如何模拟TCP式传输,并讨论了心跳包机制在检测连接状态中的作用。
摘要由CSDN通过智能技术生成
  1. OSI 7层模型 TCP/IP 4、5层模型:记清楚名字,以及每一层的功能

    /*
    应用层         应用层       应用层           提供各种协议的网络应用接口 
    传输层         传输层       表示层           数据表示,压缩与加密
    网络层         网络层       会话层           主机之间会话管理
    网络接口层      数据链路层    传输层           端与端之间的连接
                  物理层       网络层           寻址与路由选择
                              数据链路层       相邻节点的可靠性传输
                              物理层           二进制比特流传输                

    2.TCP和UDP异同点

    /*
    TCP:
    1)提供面向连接的,可靠的数据传输服务;
    2)数据无误,数据无丢失,数据无失序,数据无重复到达的通信。
    3)传输效率低,耗费资源多。
    4)数据的发送和接收不同步:(不存在数据边界)
    为了提高效率,会将多个比较小,而且发送时间间隔短的包沾成一个包去发发送,这个现象称之为粘包现象;
    每一个数据包都会有编号(序列号),每一个数据包都会有对应的应答(应答包)
    UDP:
    1)无连接的,不可靠的数据传输服务;
    2)数据有可能在传输过程中丢失,或者出现数据重复。
    3)传输效率高;
    4)限制每次传输的数据大小:1500byte,超出部分直接舍弃;
    5)数据的发送和接收是同步的:存在数据边界;

3.一些常见的协议:MAC IP MTU MSS ARP RARP ICMP IGMP

/*
MAC:48bit全球唯一,网络设备的身份标识(cmd ---> ipconfig/all),有厂商出厂后确定。
    由电气电子工程协会IEEE定义的。
        MSS:Maximum Segment Size 最大报文长度
    IP:ip协议根据数据包的目的ip地址来决定如何投递数据包。如果数据包不能直接投递给目标主机,
    那么ip协议就为他寻找下一个合适的下一跳路由器。
    MTU:Maximum Transmit Unit 最大传输单元物理接口
    (数据链路层)提供给上层(网络层(IP层))最大一次传输数据的大小。
    规定了数据链路层所能传送最大数据长度  1500字节
    ARP:ARP(Address Resolution Protocol):通过ip地址获取其对应的mac地址。
    RARP(Reverse Address Resolution Protocol):通过mac地址获取其对应的ip地址。
    ICMP协议(Internet Control Management Protocol):英特网控制管理协议,ping检测网络就是用这个协议用于在IP主机、路由器之间传递控制消息。
    IGMP协议(Internet Group Management Protocol):英特网分组管理协议,组播,广播。

4.IP地址分类,IP地址划分

答:

分类:

IPv4: 采用4个字节的无符号整数来存储IP地址,[0, 2^32-1] ==>42亿多个

IPv6:采用16个字节的无符号整数来存储IP地址 , 2^128。IPv4与IPv6不兼容

/*
地址划分:
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                   组播地址
E类地址        240.0.0.0~255.255.255.255                   实验室保留

5.特殊的IP:网络地址,广播地址分别为什么

/*
网络地址:有效的网络号+全是0的主机号---》代表一整个网络
 192.168.31.0代表192.168.31这个网络
 广播地址:有效的网络号+全是1的主机号---》代表向当前网络所有的主机发送消息。
 192.168.31.255

6.子网掩码:

/*
1)给定一个IP要知道默认子网掩码
IP:192.168.8.213    子网掩码:255.255.255.0
2)给定一个IP,告诉你要划分几个子网网段,计算子网掩码,计算每个子网网段中主机号个数,可用(可分配)主机号个数
​
3)给定IP,告诉你要划分至少要几个子网网段,以及每个子网网段中可用主机号的个数为多少。计算所有可用子网掩码
​
4)给定IP,给定子网掩码,计算网段个数,主机个数。。。。。
​


7.字节序的概念,如何用共用体的方式验证计算机是大端还是小端。 答:字节序是指不同类型的CPU主机,内存存储 多字节整数 序列的方式;


8.跨主机需要注意的内容。 答:在跨主机传输过程中,需要使用统一的字节序,即网络字节序,避免兼容性问题。


10.TCP中的send能否修改成sendto write。recv能否修改成recvfrom read.

/*
recv(sockfd, buf, len, flags); 相当于 recvfrom(sockfd, buf, len, flags, NULL,NULL),
​
所以,TCP中的recv能否替换成recvfrom。
​
send(sockfd, buf, len, flags); 相当于 sendto(sockfd, buf, len, flags, NULL, 0);
​
所以,TCP中的send函数可以用sendto替换


11.UDP中的sendto能否修改成send write。recvfrom 能否修改成recv read.

答:可以,当UDP采用connect的方式收发报文后,就可以调用 send recv write read


12.UDP中能否调用connect函数,UDP中的connect与TCP中的有什么区别;

/*
UDP中可以调用connect函数,但是不会产生连接。
TCP中的connect函数会造成三次握手,将client和server连接。
UDP中的connect不会产生连接,仅仅是将对端的IP和端口记录到内核套接字中,此时**UDP只能与记录的对端进行通信**。
TCP中的connect只能被调用一次
udp可以调用多次connect,刷新内核中对端的IP和端口,如果想要清空内核中对端的地址信息,
则将地址信息结构体中的sin_family成员填充成 AF_UNSPEC

13.广播,组播模型。广播、组播IP

广播服务器模型:                                广播客户端模型:
//1.创建套接字                                   1.创建套接字
socket();                                       socket();
//2.填充接收端的地址信息结构体                      2.设置网络属性:设置允许广播,默认是不允许广播的
struct sockaddr_in sin;                         setsockopt();
//3.必须绑定服务器                                3.非必须绑定
bind();                                         bind();
//4.接收数据                                     4.发送数据
recvform();                                     sendto();
//5.关闭套接字                                   5.关闭套接字
close(socket);                                  close(socket);
​
组播服务器模型:                                    组播客户都模型:
//1.创建套接字                                   1.创建套接字
    socket();                                   socket();
//2.加入多播组                                   2.非必须绑定
  setsockopt();                                 bind;
//3.填充接收端的IP和端口                           3.填写接收端的地址信息结构体
struct sockaddr_in sin;                         struct sockaddr_in sin;
//4.必须绑定                                     4.发送数据
bind;                                           sendto();
//5.接收数据                                     5.关闭套接字
 recvfrom();                                     close(socket);
//6.关闭套接字
 close(socket);
​
    
广播IP:默认是:有效的网络号+全是1的主机号---》代表向当前网络所有的主机发送消息。
    例如本网段下的广播IP(192.168.31.255), 0.0.0.0
0.0.0.0:将本机所有可用IP绑定到套接字上:本机IP192.168.31.61,127.0.0.1(本地环回)
组播IP:224.0.0.0~239.255.255.255
​


14.多进程并发服务器模型,多线程并发服务器模型

//TCP多进程并发服务器:                      TCP多线程并发服务器:
//循环回收子进程                               创建套接字
void callBack(int sig)                          socket();
{                                           //必须绑定
    while(waitpid(-1,NULL,WNOHANG)>0);          bind
}                                           //设置监听状态
//捕捉信号                                      listen();
signal(17(SIGCHLD),callBack);                   while(1)
//创建套接字                                     {
socket();                                           newfd=accpet();
//必须绑定                                           pthread_create(&tid,NULL,callBack,&msg);
bind();                                             //pthread_detach(tid)
//设置监听状态                                    }
listen();                                       void callBack(void arg)
while(1)                                        {
{                                                   pthread_detach(pthread_self());
    newfd=accept();                                   recv();
    //创建一个分支进程                                  send();
    pid=fork();                                       close(newfd);
    if(pid>0)                                         pthread_exit();
        //主进程                                   }
        close(newfd);
        //分支进程
        else if(0==pid)
    {
     close(sfd);
     //接收数据
     recv();
     //发送数据
     send();
     close(newfd);
     //退出分支进程
     exit(0);
    }else
    {
        perror("fork");
        return -1;
    }
}
close(sfd);


15.IO多路复用分类,简述select,poll流程

/*
    单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力
分类:
select()
poll()
eopll()
流程:
IO多路复用在Linux下包括了三种,select、poll、epoll,抽象来看,他们功能是类似的,但具体细节各有不同:首先都会对一组文件描述符进行相关事件的注册,然后阻塞等待某些事件的发生或等待超时。更多细节详见下面的 "具体怎么用"。IO多路复用都可以关注多个文件描述符,但对于这三种机制而言,不同数量级文件描述符对性能的影响是不同的


16.三次握手、四次挥手。 1)简述三次握手,四次挥手流程 2)简述TCP建立连接,断开连接的过程。 3)简述如何用UDP的模型,实现TCP式传输:UDP和TCP在传输时候的区别:1.三次握手 2.应答 3.四次挥手。

/*
三次握手产生的。发起端肯定是客户端
第一次握手:客户端发送SYN包(SYN=1, seq = x)给服务器,并进入SYN_SEND状态,等待服务器返回
确认包。
第二次握手:服务器收到SYN包,确认客户端的SYN,发送ACK包(ACK=1, ack=x+1),同时发送一个
SYN包(SYN=1,seq=y),并进入SYN_RECV状态
第三次握手:客户端收到服务器的SYN以及ACK包,向服务器发送ACK包(ACK=1, ack = y+1),此时三
次握手的包发送完毕,客户端和服务器进入ESTABLISHED状态。完成三次握手;
​
四次握手
断开连接,可能是服务器发起的,也可能是客户端发起的;
第一次挥手,主动关闭方发送一个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后关闭连接。

17.udp是无连接的,如何能够让本地知道对端掉线。 心跳包机制,每隔一定时间发送一个心跳包给服务器端,若服务器长时间没有收到心跳包,则服务器可以认为客户端掉线; 如果客户端长时间没有收到服务器的心跳包应答,则客户端可以认为服务器掉线。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值