一、网络协议

国际标准化组织(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)

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

UNIX网络通信的更多相关文章

  1. Unix下网络编程概述

    这部分我要学习的是Unix下的网络编程,参照的书籍是W. Richard. Stevens的<Unix网络编程>卷一和卷二,由于本身现在从事的工作是java后台开发,对客户端-服务器的这种 ...

  2. JAVA基础知识复习小结

    集合 Set集合 Set集合的基本特征是元素不允许重复.HashSet不保存元素顺序,LinkedHashSet用链表保持元素的插入顺序,TreeSet可定制排序规则. HashSet的底层是用Has ...

  3. Linux IPC udp/tcp/UNIX域 socket编程

    UNIX域套接字本地通信即在socket第一个参数中选择AF_LOCAL,socket是BSD提出的一种适用于所有的情况的进程间通信的方式,虽然现在多用于网络通信,但是本机内的进程间通信也是没有问题的 ...

  4. UNIX中的文件类型

    Unix的文件类型信息包含在stat结构的st_mode成员中可以用宏确定文件类型: 普通文件(S_ISREG()):包含某种形式数据的常用文件类型 目录文件(S_ISDIR()):这种文件包含其他文 ...

  5. (十三) [终篇] 一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  6. 网络通信之Socket与LocalSocket的比较

    Socket与LocalSocket都可以实现网络通信,两个有什么区别呢? LocalSocket其通信方式与Socket差不多,只是LocalSocket没有跨越网络边界. 于是,思考到一个问题:a ...

  7. (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  8. UC编程之网络通信(TCP/UDP)

    网络常识 OSI 7层模型(人机交互) 物理层.数据链路层.网络层.传输层.会话层.表现层.应用层 常见协议: tcp/udp/ip/ftp/http... IP地址--就是计算机在网络中的地址,是一 ...

  9. QNX 实时操作系统(Quick Unix)

    Gordon Bell和Dan Dodge在1980年成立了Quantum Software Systems公司,他们根据大学时代的一些设想写出了一个能在IBM PC上运行的名叫QUNIX(Quick ...

随机推荐

  1. TCP/IP三次握手与四次挥手的正确姿势

    0.史上最容易理解的:TCP三次握手,四次挥手 https://cloud.tencent.com/developer/news/257281 A 理解TCP/IP三次握手与四次挥手的正确姿势http ...

  2. vector的学习(系统的学习)

    首先讲一下vector,vector被称作向量容器,头文件要包括#include<vector> 可以考虑下面定义: vector<int> x; vector<char ...

  3. Hive 基本语法操练(一):表操作

    Hive 和 Mysql 的表操作语句类似,如果熟悉 Mysql,学习Hive 的表操作就非常容易了,下面对 Hive 的表操作进行深入讲解. **(1)先来创建一个表名为student的内部表** ...

  4. 开源分布式Job系统,调度与业务分离-如何创建一个计划HttpJob任务

    项目介绍: Hangfire:是一个开源的job调度系统,支持分布式JOB!! Hangfire.HttpJob 是我针对Hangfire开发的一个组件,该组件和Hangfire本身是独立的.可以独立 ...

  5. .Net core使用XRPC创建远程接口的Actor对象

    Actor是一种高并发处理模型,每个Actor都有着自己的状态有序消息处理机制,所以在业务处理的情况并不需要制定锁的机制,从而达到更高效的处理能性.XRPC是一个基于远程接口调用的RPC组件,它可以简 ...

  6. Entity Framework小知识

    记录在使用EF中使用的技巧,以备查阅. 1.当需要查询一个列总和的时候,如果列是允许NULL或者未查到信息的时候,想要返回的是0 而非NULL时 db.表名.Sum(p=> (decimal?) ...

  7. MobaXterm连接远程Linux服务器

    MobaXterm是一个X服务器和一组的Unix命令(GNU/ Cygwin的)封装在一个单一的便携式exe文件的增强终端. MobaXterm包括一个巨大的multitab原生的Windows终端. ...

  8. CAS登录认证的简单介绍

    参考博客:  https://www.jianshu.com/p/8daeb20abb84 下面是CAS最基本的协议过程: 下面是CAS Web工作流程图: 名词解释 Ticket Grangting ...

  9. 【转】【C++】【MFC】关于RADIO BUTTON的使用方法

    *原文地址:http://blog.csdn.net/c_cyoxi/article/details/23868979 1. 环境:VS2010 2. 分组 将radio1.radio2.radio3 ...

  10. nc扫描端口

    nc -n -v -z -w 1 ip地址 1-1000 (端口号) 详细信息 -v 排除dns  -n 不发送任何数据-z 超时设置为1秒 -w 1