博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UNIX网络通信详解
阅读量:7061 次
发布时间:2019-06-28

本文共 2918 字,大约阅读时间需要 9 分钟。

hot3.png

导读 计算机与计算机之间要有统一的连接标准才能够进行通信,这个标准称之为互联网协议,而网络就是物理链接介质+互联网协议。 按照功能不同,人们将互联网协议分为osi七层或tcp/ip五层或tcp/ip四层,今天我们一起来看看unix网络通信原理

一、网络协议

国际标准化组织(ISO)定义了网络协议的基本框架,被称为OSI模型。OSI模型包括应用层、表示层、会话层、传输层、网络层、数据链路层及物理层。而OSI模型过于复杂至今没有得到实际的应用。

TCP/IP协议模型将OSI的7层协议模型简化为4层,从而更有利于实现和使用。TCP/IP协议模型包括应用层、传输层、网络层、网络接口层。

TCP/IP协议与OSI模型的对应关系如下图:

UNIX网络通信详解UNIX网络通信详解

二、套接字socket

它是一种可以进行网络通信的内核对象,它有一个唯一的标识符,一般称它为socket描述符,跟文件描述符类似,也可以用read/wrote/close操作。

int socket(int domain, int type, int protocol);/*功能:创建socket对象domain:通信地址类型AF_UNIX / AF_LOCAL :本地进程间通信AF_INET :使用ipv4地址通信AF_INET6:使用ipv6地址通信type:SOCK_STREAM :数据流协议,TCP面向连接的通信协议优点:安全可靠,数据不丢失,但速度慢。一般常用于安全性较高的场景SOCK_DGRAM :数据报协议,UDP面向无连接的通信协议优点:速度快,数据可能会丢失,安全性和可靠性于TCP相比不高一般用于安全性要求不高,但对速度有要求的场景。protocol:特殊协议一般不使用,直接写 0*/
准备通信地址:基本通信地址struct sockaddr{sa_family_t sa_family;char sa_data[14];}本地通信地址struct sockaddr_un{// 通信地址类型sun_family_t sun_family;// socket文件的路径char sun_path[100];}网络通信地址struct sockaddr_in{//通信地址类型short int sin_family;//端口号in_port_t sin_port;//ip地址struct in_addr sin_addr;}准备好的通信地址通常要将其强制转换成基本通信地址才能传给函数使用。int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);//功能:把socket对象与通信地址建立联系int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);//功能:连接通信目标//socketaddr:目标地址

三、网络通信的数据存储方式

个人计算机系统数据的存储方式可能是大端,也可能是小端,网络通信时需要的是大端数据,必须把数据转换成大端。

uint32_t htonl(uint32_t hostlong);//功能:把32位的主机字节序转换成32位的网络字节序uint16_t htons(uint16_t hostshort);//功能:把16位的主机字节序转换成16位的网络字节序uint32_t ntohl(uint32_t netlong);//功能:把32为网络字节序转换成32位的主机字节序uint16_t ntohs(uint16_t netshort);//功能:把16为网络字节序转换成16位的主机字节序生成端口号端口号就是一个16为的无符号整数uint16_t htons(uint16_t hostshort);生成ip地址in_addr_t inet_addr(const char *cp);//功能:把点分十进制的字符串ip地址转换成32位的无符号整数char *inet_ntoa(struct in_addr in);//功能:把32位的网络字节序的ip地址转换成点分十进制的字符串ip地址

四、网络通信(UDP)

进程A:创建socket对象->准备地址->绑定->接收数据和来时的地址->原路返回数据->关闭socket

进程B:创建socket对象->准备地址->向目标发送数据->接收数据->关闭socket

当socket对象被全部关闭后,会在内核中停留一段时间(给一个重新连接的机会),如果再使用同样的ip地址和端口号时就会失败(延时关闭)

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);//功能:接收数据并获取发送端的地址//addrlen:是参数,要得到的src_addr的长度ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);//功能:发送数据到指定的目标

五、网络通信(TCP)

面向连接的网络通信,在通信过程中时刻保持连接,这种通信方式类似与打电话,能保证安全可靠、数据不丢失,但与UDP相比传输速度略低。

进程A:创建socket->准备地址->绑定->监听(设置队列长度)->等待连接->通信->关闭。

进程B;创建socket->准备地址->连接->通信->关闭

int listen(int sockfd, int backlog);//功能:设置socket对象最大的排队数量int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);//功能:等待其他主机与当前socket建立连接关系。//返回值:建立连接的描述符,此后通信都用此描述符int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);//功能:连接通信目标//socketaddr:目标地址ssize_t recv(int sockfd, void *buf, size_t len, int flags);//功能:网络通信专用的数据接收//flag: 0 阻塞// 1 不阻塞//返回值:-1 时,说明连接断开,此时应该结束循环ssize_t send(int sockfd, const void *buf, size_t len, int flags);//功能:网络通信专用的数据发送//返回值:-1 时,说明连接断开 ,此时应该结束循环

原文来自: 

转载于:https://my.oschina.net/ssdlinux/blog/1926413

你可能感兴趣的文章
图片自适应宽度显示正方形
查看>>
如何提高队列的消息处理效率
查看>>
C#实现打印功能
查看>>
Filter接口编写过滤器
查看>>
Java中的代理
查看>>
Android深度探索读后感 第三章
查看>>
Qt内部机制及逆向
查看>>
关于photoshop钢笔工具中各点对应到“贝塞尔曲线”中的含义(cocos2d-x与iOS)
查看>>
850 USB 烧录模式
查看>>
I.MX6 PLL5 clock hakcing
查看>>
Aidl
查看>>
顺序表的静态建立
查看>>
「技巧」如何快速安装 Sketch 插件
查看>>
C#中对文件的操作小结
查看>>
事件流
查看>>
苹果中毒员工称症状复发:入住当地医院遭拒
查看>>
[2039]数据结构上机实验之二分查找
查看>>
php foreach 看鸟哥的记录,存档
查看>>
numpy数组及处理:效率对比
查看>>
javascript事件模型
查看>>