TreeMind树图在线AI思维导图
当前位置:树图思维导图模板IT互联网互联网干货网络编程知识清单思维导图

网络编程知识清单思维导图

  收藏
  分享
免费下载
免费使用文件
蜂蜂 浏览量:522023-03-20 20:58:18
已被使用7次
查看详情网络编程知识清单思维导图

网络编程思维导图

树图思维导图提供 网络编程知识清单 在线思维导图免费制作,点击“编辑”按钮,可对 网络编程知识清单  进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:e3b1e178f01329a2b30ce1fd6d6d9f6b

思维导图大纲

网络编程思维导图模板大纲

网络发展史

最早期:ARPAnet,即“阿帕网”,使用网络控制协议(Network Control Protocol,NCP),不能互联不同类型的计算机和不同类型的操作系统,没有纠错功能;

TCP协议分成了两个不同的协议: 用来检测网络传输中差错的传输控制协议TCP 专门负责对不同网络进行互联的互联网协议IP

局域网和广域网

局域网(LAN)

是本地的网络,只能实现小范围短距离的网络通信。

广域网(Wan)

广域网分支可能少,但类型多,连接了很多大的局域网。

其他设备

光猫

交换机与路由器

网线

IP地址

基本概念

●IP地址是Internet中主机的标识 ●Internet中的主机要与别的机器通信必须具有一个IP地址 ●IP地址为32位(IPv4)或者128位(IPv6) ●表示形式:常用点分形式,如202.38.64.10,最后都会转换为一个32位的无符号整数。

ip地址划分(IPv4)

二级划分 ip=网络号+主机号 网络号:表示是否在一个网段内(局域网) 主机号:标识在本网段内的ID,同一局域网不能重复

特殊地址

0.0.0.0:在服务器中,0.0.0.0指的是本机上的所有IPV4地址

127.0.0.1:回环地址/环路地址,所有发往该类地址的数据包都应该被loop back。

子网掩码

子网掩码 & ip地址 = 网络地址 (网段) ~子网掩码 & ip地址 = 主机地址

网络模型

OSI模型

TCP/IP模型

常见网络协议

网络接口和物理层: ppp:拨号协议(老式电话线上网方式) ARP:地址解析协议 IP-->MAC RARP:反向地址转换协议 MAC-->IP 网络层: IP(IPV4/IPV6):网间互连的协议 ICMP:网络控制管理协议,ping命令使用 IGMP:网络分组管理协议,广播和组播使用 传输层: TCP:传输控制协议 UDP:用户数据报协议 应用层: SSH:加密协议 telnet:远程登录协议 FTP:文件传输协议 HTTP:超文本传输协议 DNS:地址解析协议 SMTP/POP3:邮件传输协议

UDP和TCP

UDP TCP 协议相同点:都存在于传输层

TCP

是一种面向连接的传输层协议,它能提供高可靠性通信(即数据无误、数据无丢失、 数据无失序、数据无重复到达的通信) 适合于对传输质量要求较高,以及传输大量数据的通信。

UDP

是不可靠的无连接的协议。在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输。 适用情况: 1、发送小尺寸数据(如对DNS服务器进行IP地址查询时) 2、在接收到数据,给出应答较困难的网络中使用UDP。

socket

简介

1、是一个编程接口 2、是一种特殊的文件描述符 3、并不仅限于TCP/IP协议 4、面向连接 5、无连接

类型

流式套接字(SOCK_STREAM)   TCP

数据报套接字(SOCK_DGRAM)  UDP

原始套接字(SOCK_RAW)

端口号

●为了区分一台主机接收到的数据包应该转交给哪,使用端口号来区分 ●TCP端口号与UDP端口号独立 ●端口号一般由IANA (Internet Assigned Numbers Authority) 管理 ●端口用两个字节来表示 2byte

众所周知端口:1~1023(1~255之间为众所周知端口,256~1023端口通常由UNIX系统占用) 已登记端口:1024~49151 动态或私有端口:49152~65535

字节序

小端序(little-endian) - 低序字节存储在低地址 (主机字节序) 大端序(big-endian)- 高序字节存储在低地址 (网络字节序) 网络中传输的数据必须使用网络字节序,即大端字节序

笔试题:写一个函数,判断当前主机的字节序? 测试方式:共用体、指针强转、数据类型强转

主机字节序到网络字节序

u_long htonl (u_long hostlong); u_short htons (u_short short);

网络字节序到主机字节序

u_long ntohl (u_long hostlong); u_short ntohs (u_short short);

IP地址转换

in_addr_t inet_addr(const char *cp); //从人看的ip地址转为机器使用的32位无符号整数 char *inet_ntoa(struct in_addr in); //从机器到人

TCP编程

子主题 2

UDP编程

linux下I/O模型及特点

(1)阻塞式IO

最简单、最常用;效率低

(2)非阻塞式IO

可以处理多路IO;需要轮询,浪费CPU资源

设置非阻塞

1、通过函数参数设置

Recv函数最后一个参数写为0,为阻塞,写为MSG_DONTWAIT:表示非阻塞。

2.通过fcntl函数设置文件描述符属性

int arg; //1.获取原来文件描述符属性 arg=fcntl(0,F_GETFL); //2.修改原属性 arg |= O_NONBLOCK; //3.修改好的属性设置回去 fcntl(0,F_SETFL,arg);

(3)信号驱动IO (异步IO模型 非重点)

异步通知模式,需要底层驱动的支持

//设置将APP进程号提交给内核驱动 fcntl(fd,F_SETOWN,getpid()); //设置异步通知 int flags; flags = fcntl(fd, F_GETFL); //获取原属性 flags |= O_ASYNC; //设置异步通知 fcntl(fd, F_SETFL, flags); //修改的属性设置回去 signal(SIGIO,handler);

(4)IO多路复用

基本流程: 1. 先构造一张有关文件描述符的表(集合、数组); 2. 将你关心的文件描述符加入到这个表中; 3. 然后调用一个函数。 select / poll 4. 当这些文件描述符中的一个或多个已准备好进行I/O操作的时候 该函数才返回(阻塞)。 5. 判断是哪一个或哪些文件描述符产生了事件(IO操作); 6. 做对应的逻辑处理;

1.select

1. 一般情况下,一个进程最多只能监听1024个文件描述符 (千级别) 2. select被唤醒之后需要重新轮询一遍驱动的poll函数,效率比较低(消耗CPU资源); 3. select每次会清空表,每次都需要拷贝用户空间的表到内核空间,效率低(一个进程0~4G,0~3G是用户态,3G~4G是内核态,拷贝是非常耗时的);

2.poll实现

1. 优化文件描述符个数的限制;(根据poll函数第一个函数的参数来定,如果监听的事件为1个,则结构体数组元素个数为1,如果想监听100个,那么这个结构体数组的元素个数就为100,由程序员自己来决定) 2. poll被唤醒之后需要重新轮询一遍驱动的poll函数,效率比较低 3. poll不需要重新构造文件描述符表,只需要从用户空间向内核空间拷贝一次数据即可

3.epoll实现 (异步)

•监听的最大的文件描述符没有个数限制(理论上,取决与你自己的系统) •异步I/O,Epoll当有事件产生被唤醒之后,文件描述符主动调用callback(回调函数)函数直接拿到唤醒的文件描述符,不需要轮询,效率高 •epoll不需要重新构造文件描述符表,只需要从用户空间向内核空间拷贝一次数据即可

服务器模型

循环服务器模型

同一个时刻只能响应一个客户端的请求

并发服务器模型

同一个时刻可以响应多个客户端的请求

多进程模型

多线程模型

IO多路复用模型

网络超时检测

利用函数参数设置

如使用select/poll/epoll函数最后一个参数可以设置超时。

利用setsockopt属性设置

//设置接收超时 struct timeval tm={2,0}; setsockopt(acceptfd,SOL_SOCKET,SO_RCVTIMEO,&tm,sizeof(tm)); //设置超时之后,当时间到会打断接下来的阻塞在这个文件描述符的函数,直接错误返回

利用alarm定时器设置

//设置信号属性 struct sigaction act; sigaction(SIGALRM,NULL,&act);//获取原属性 act.sa_handler=handler;//修改属性 sigaction(SIGALRM,&act,NULL);//将修改的属性设置回去

广播

发送流程

1.创建用户数据报套接字 2.缺省创建的套接字不允许广播数据包,需要设置属性(setsockopt)

int on = 1; setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));

接收流程

1.创建用户数据报套接字 2.绑定IP地址(广播IP或0.0.0.0)和端口 3.绑定的端口必须和发送方指定的端口相同 4.等待接收数据

组播

●组播是一个人发送,加入到多播组的人接收数据。 ●多播方式既可以发给多个主机,又能避免象广播那样带来过多的负载(每台主机要到传输层才能判断广播包是否要处理)

组播地址

不分网络地址和主机地址,第1字节的前4位固定为1110 。是D类IP 224.0.0.1 – 239.255.255.255

组播发送

1.创建用户数据报套接字 2.接收方地址指定为组播地址 3.指定端口信息 4.发送数据包

组播接收

1.创建用户数据报套接字 2.加入多播组 3.绑定IP地址(加入组的组IP或0.0.0.0)和端口 4.等待接收数据

加入多播组核心代码:

struct ip_mreq { struct in_addr imr_multiaddr; /* 指定多播组IP */ struct in_addr imr_interface; /* 本地网卡地址,通常指定为 INADDR_ANY--0.0.0.0*/}; } struct ip_mreq mreq; bzero(&mreq, sizeof(mreq)); mreq.imr_multiaddr.s_addr = inet_addr("224.10.10.1"); mreq.imr_interface.s_addr = INADDR_ANY; setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));

本地套接字通信

●socket同样可以用于本地通信 ●创建套接字时使用本地协议AF_UNIX(或AF_LOCAL)。 ●分为流式套接字和用户数据报套接字 ●和其他进程间通信方式相比使用方便、效率更高 ●常用于前后台进程通信

网络协议头分析

数据的封装与传递过程

以太网帧完整帧格式

三次握手和四次挥手

三次握手

第一次握手:客户通过调用connect进行主动打开(active open)。这引起客户TCP发送一个SYN(表示同步)分节(SYN=J),它告诉服务器客户将在连接中发送到数据的初始序列号。并进入SYN_SEND状态,等待服务器的确认。 第二次握手:服务器必须确认客户的SYN,同时自己也得发送一个SYN分节,它含有服务器将在同一连接中发送的数据的初始序列号。服务器以单个字节向客户发送SYN和对客户SYN的ACK(表示确认),此时服务器进入SYN_RECV状态。 第三次握手:客户收到服务器的SYN+ACK。向服务器发送确认分节,此分节发送完毕,客户服务器进入ESTABLISHED状态,完成三次握手。

四次挥手

第一次挥手:某个应用进程首先调用close,我们称这一端执行主动关闭。这一端的TCP于是发送一个FIN分节,表示数据发送完毕。 第二次挥手:接收到FIN的另一端执行被动关闭(passive close)。这个FIN由TCP确认。它的接收也作为文件结束符传递给接收端应用进程(放在已排队等候应用进程接收到任何其他数据之后) 第三次挥手:一段时间后,接收到文件结束符的应用进程将调用close关闭它的套接口。这导致它的TCP也发送一个FIN。 第四次挥手:接收到这个FIN的原发送端TCP对它进行确认。 面向字节的数据传送流(如TCP字节流、Unix管道等)也使用EOF表示在某个方向上不再有数据待传送。在TCP字节流中,EOF的读或写通过收发一个特殊的FIN分节来实现。

数据库编程

数据库简介

常用的数据库 大型数据库 :Oracle 中型数据库 :Server是微软开发的数据库产品,主要支持windows平台 小型数据库 : mySQL是一个小型关系型数据库管理系统。开放源码

sqlite3编程

1.int sqlite3_open(char *path, sqlite3 **db); 功能:打开sqlite数据库,如果数据库不则存在创建它 path: 数据库文件路径 db: 指向数据库句柄的指针 返回值:成功返回SQLITE_OK,失败返回错误码(非零值)

2.int sqlite3_close(sqlite3 *db); 功能:关闭sqlite数据库 返回值:成功返回SQLITE_OK,失败返回错误码 返回值:返回错误信息

3.执行sql语句接口 int sqlite3_exec( sqlite3 *db, /* An open database */ const char *sql, /* SQL to be evaluated */ int (*callback)(void*,int,char**,char**), /* Callback function */ void *arg, /* 1st argument to callback */ char **errmsg /* Error msg written here */ ); 功能:执行SQL操作 db:数据库句柄 sql:要执行SQL语句 callback:回调函数(满足一次条件,调用一次函数,用于查询) 再调用查询sql语句的时候使用回调函数打印查询到的数据 arg:传递给回调函数的参数 errmsg:错误信息指针的地址 返回值:成功返回SQLITE_OK,失败返回错误码 回调函数: typedef int (*sqlite3_callback)(void *para, int f_num, char **f_value, char **f_name); 功能:select:每找到一条记录自动执行一次回调函数 para:传递给回调函数的参数(由 sqlite3_exec() 的第四个参数传递而来) f_num:记录中包含的字段数目 f_value:包含每个字段值的指针数组(列值) f_name:包含每个字段名称的指针数组(列名) 返回值:成功返回SQLITE_OK,失败返回-1,每次回调必须返回0后才能继续下次回调

4.不使用回调函数执行SQL语句(只用于查询) char **sp=NULL; int sqlite3_get_table(sqlite3 *db, const char *sql, char ***resultp, int *nrow, int *ncolumn, char **errmsg); 功能:执行SQL操作 db:数据库句柄 sql:SQL语句 resultp:用来指向sql执行结果的指针 nrow:满足条件的记录的数目(但是不包含字段名(表头 id name score)) ncolumn:每条记录包含的字段数目 errmsg:错误信息指针的地址 返回值:成功返回SQLITE_OK,失败返回错误码

5.返回sqlite3定义的错误信息 char *sqlite3_errmsg(sqlite3 *db);

相关思维导图模板

Linux 网络基础知识思维导图

树图思维导图提供 Linux 网络基础知识 在线思维导图免费制作,点击“编辑”按钮,可对 Linux 网络基础知识  进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:199680f0e48eac8a1aeaadb90447d4f4

软考软件设计师思维导图

树图思维导图提供 软考软件设计师 在线思维导图免费制作,点击“编辑”按钮,可对 软考软件设计师  进行在线思维导图编辑,本思维导图属于思维导图模板主题,文件编号是:6a80d6e336e8d531c07d47352540a4df