UNIX网络通信详解

Posted Linux就该这么学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UNIX网络通信详解相关的知识,希望对你有一定的参考价值。


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

一、网络协议

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

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

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

二、套接字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)

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)

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 时,说明连接断开 ,此时应该结束循环


让您学习到的每一节课都有所收获

《Linux就该这么学》是一本由资深运维专家刘遄老师及国内多名红帽架构师(RHCA)基于最新RHEL7系统共同编写的高质量Linux技术自学教程,极其适合用于Linux技术入门教程或讲课辅助教材。荣获双11、双12购物狂欢节IT品类书籍销量冠军,2017年、2018年国内读者增速最快的技术书籍,您可以在京东、当当、亚马逊及天猫搜索书名后购买,亦可加刘遄老师微信交流学习(手指按住下图3秒钟即可自动扫描)~

刘遄老师QQ:5604583

☀ Linux技术交流群:2659793(新群,火热加群中……

☀ 官方站点:www.linuxprobe.com

☀ 书籍在线学习(电脑在线阅读效果更佳

http://www.linuxprobe.com/chapter-00.html