| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 网络以及通信 -> 正文阅读 |
|
[网络协议]网络以及通信 |
网络网络模型有哪两类?答:OSI、 TCP/IP OSI有哪七层?答:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层 端口号的作用?答:区别不同服务 TCP建立与关闭连接分别几次握手?答:3次 4次 ? 总结? OSI模型七层结构简介应用OSI 模型? 帧规范一种典型的Ethernet帧 ? 一种典型的Token Ring传输控制协议/网际协议TCP/IP模型和OSI的比较相同点
不同点
? ? TCP/IP核心协议? IP协议
IP数据包 传输控制协议( TCP)协议
TCP数据包 ? 在传输数据之前,建立对话的两个端点之间交换称为握手的控制信息。
UDP (用户数据报协议)
TCP和UDP的区别
字节序(大小端)大端字节序: 低位存在高地址, 高位存在低地址 小端字节序:? 低位存在低地址, 高位存在高地址 判断字节序 static int isBigEndian() { uint32_t thisx = 0x01020304; uint8_t *thisp = (uint8_t *)&thisx; return (*thisp == 1) ? 1 : 0; } int main(int argc, char **argv) { printf("Byte order: %s Endian\n", isBigEndian() ?"Big" :"Little"); return 0; } 网络基础知识本机端口号和网络端口相互转换uint16_t htons(uint16_t hostshort);//本机 ---->网络 uint16_t ntohs(uint16_t netshort); // 网络 --->本机 ????????????? //htonl为32位机 点分十进制IP 地址 和 网络地址相互转换int inet_pton(int af, const char *src, void *dst); 函数功能: 将点分十进制地址? 转成网络地址 参数说明: af:? 地址族? IPV4:? AF_INET IPV6:? AF_INET6 src:? ip地址内存的起始地址 dst:?? 存放网络地址内存的起始地址 const char *inet_ntop(int af, const void *src, ???????????????????????????? char *dst, socklen_t size); 函数功能:将网络地址 转成点分十进制地址 (字符串存储) 参数说明: af:? 地址族 src:? 网络地址内存起始地址 dst:? 存放点分十进制地址内存的起始地址 size : 内存的大小 例:inet_pton(AF_INET, "127.0.0.1", &seraddr.sin_addr.s_addr); 地址族结构体:?通过该结构体打包IP和端口号 原始结构体类型(已经不使用!): struct sockaddr { ?????? sa_family_t sa_family;??? /* 地址族 */ ?????? char???? sa_data[14];??? /* 地址值,实际可能更长 */ }; 改进后的结构体: struct in_addr { ?????? in_addr_t s_addr; }; struct sockaddr_in { ?????? uint16_t? sin_family;? //地址族? IPv4:? AF_INET ?????? uint16_t?? sin_port;?? // 网络字节序端口号 struct? in_addr sin_addr;? // 网络字节序的IP地址 ?????? char??? sin_zero[8]; }; 例:struct sockaddr_in? seraddr; ?????? int addrlen = sizeof(struct sockaddr_in); ?????? seraddr.sin_family = AF_INET; ?????? seraddr.sin_port = htons(8001); ?????? inet_pton(AF_INET, "127.0.0.1", &seraddr.sin_addr.s_addr); ?????? ret = bind(sockfd, (struct sockaddr*)&seraddr, addrlen); TCP客户服务器编程模型? 客户端通常的调用序列是:
服务器端通常的调用序列为:
server服务器端创建监听套接字int socket(int domain, int type, int protocol); 参数说明: domain :? 地址族???? ???????? IPV4:? AF_INET ???????? IPV6:? AF_INET6 type :? 协议类型??? ???????? SOCK_STREAM :流式协议 ???????? SOCK_DGRAM? :报文协议 protoal:? 0? 返回值: 成功返回新的套接字 失败返回-1 绑定地址和端口号int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen); 参数说明: sockfd :监听文件描述符 addr? :? 打包网络字节序地址和端口号结构体变量的地址 addrlen:? 结构体的长度 返回值:成功返回0, 失败返回-1 例:bind(sockfd, (struct sockaddr*)&seraddr, addrlen); 通知内核监听套接字int listen(int sockfd, int backlog); 参数说明: sockfd :监听文件描述符 backlog:? 设置监听队列的长度 返回值:成功返回0, 失败返回-1 listen(sockfd, 10) 等待接收客户端int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); 参数说明: sockfd :监听文件描述符 addr? :通用地址结构体变量地址, (保存请求连接客户端的IP + PORT) addrlen:? 保存结构体长度变量的地址 返回值: 成功返回新的套接字, 专门和对应的客户端通讯(全双工) 失败返回-1 ps : accept是一个阻塞函数, 如果没有客户端请求连接, 会一直阻塞等待, 一旦有客户端连接,解除阻塞,接收客户端 cfd = accept(sockfd, (struct sockaddr*)&cliaddr, &addrlen); 端口复用int opt = 1; setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); client客户端创建监听套接字int socket(int domain, int type, int protocol); 参数说明: domain :? 地址族???? ????????????? IPV4:? AF_INET ????????????? IPV6:? AF_INET6 type :? 协议类型??? ????????????? SOCK_STREAM :流式协议 ????????????? SOCK_DGRAM? :报文协议 protoal:? 0? 返回值: 成功返回新的套接字 失败返回-1 2、请求连接 int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen); 参数说明: sockfd? : 套接字 addr?? :? 存放服务器地址和端口号的地址族结构体变量地址 addrlen:? 结构体长度 返回值:? 成功返回0, 失败返回-1 例:ret = connect(sockfd, (struct sockaddr*)&seraddr, addrlen); select函数int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout); 参数说明: nfds:? 最大文件描述符+1 readfds: 监听读集合地址 writefds: 监听写集合地址??? NULL exceptfds: 监听异常集合地址?? NULL timeout : 设置超时时间?? struct timeval { long??? tv_sec;???????? /* seconds */ long??? tv_usec;??????? /* microseconds */ }; 返回值: >0:? 返回准备好的文件描述符个数 =0:?? 超时时间到了 -1:?? 错误 例:ret = select(maxfd+1, &rset, NULL, NULL, &tv); 辅助函数: void FD_CLR(int fd, fd_set *set);? //将fd从set集合中移除 int? FD_ISSET(int fd, fd_set *set); //判断fd是否在set集合中,如果在返回真,否则返回假 void FD_SET(int fd, fd_set *set); // 将fd加入set集合中 void FD_ZERO(fd_set *set);? //? 清空set集合中的内容 epoll监听函数创建集合空间?? int epoll_create(int size); 参数: size? : 指定文件描述符的个数 返回值: 成功:返回与集合关联的文件描述符 失败:? -1 2、管理集合空间中的文件描述符 ??? int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); ?????? 参数说明: epfd:和集合关联的文件描述符 op :? 命令参数 ????? EPOLL_CTL_ADD:? 往集合中添加文件描述符 ????? EPOLL_CTL_MOD: 修改集合中文件描述符的信息 ????? EPOLL_CTL_DEL:? 删除集合中指定的文件描述符 fd:? 操作的文件描述符 event:? 如果是删除操作,该参数忽略,直接传NULL ???????? 如果是添加操作, 通过该参数告诉内核监听指定文件描述符的指定时间 ?typedef union epoll_data { ?????????????? void??????? *ptr; ?????????????? int????????? fd; ?????????????? uint32_t???? u32; ?????????????? uint64_t???? u64; ?????????? } epoll_data_t; ?????????? struct epoll_event { ?????????????? uint32_t???? events;????? /* Epoll events */ ?????????????? epoll_data_t data;??????? /* User data variable */ ?????????? }; ????????? ?????????? events:??????? EPOLLIN(读事件) 3、监听集合中的文件描述符 ?int epoll_wait(int epfd, struct epoll_event *events, ????????????????????? int maxevents, int timeout); 参数说明: epfd:和集合关联的文件描述符 events:存放准备好文件描述符信息数组的起始地址 maxevents:? 数组的最大元素个数 timeout? :设置超时时间?? (以毫秒为单位的) ????????? >0? : 指定超时时间 ????????????? ? =0? : 非阻塞函数 ?????? ?????? ? -1? : 永久阻塞 返回值: >0 : 准备好的文件描述符个数 =0 :超时时间到了 -1 :出错 #endif |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 21:42:00- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |