TCP/IP分层模型

OSI协议参考模型,它是基于国际标准化组织(ISO)的建议发展起来的,

它分为7个层次:应用层、表示层、会话层、传输层、网络层、数据链路层及物理层。

这个7层的协议模型虽然规定得非常细致和完善,但在实际中却得不到广泛的应用,其重要的原因之一就在于它过于复杂。

但它仍是此后很多协议模型的基础。与此相区别的TCP/IP协议模型将OSI的7层协议模型简化为4层,从而更有利于实现和使用。

协议结构:

以太网协议格式

IP协议格式

TCP协议格式

UDP协议格式

TCP/IP的分层模型

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

API函数:

1.socket

函数的作用:建立一个新的socket套接字

函数的原型:int socket(int domain,int type,int protocol)

函数的参数:domain:表示使用何种地址类型,AF_INET:IPV4;  AF_INET6:IPV6

type:SOCK_STREAM:TCP面向数据流的

SOCK_DGRAM: UDP使用不连续不可信赖的数据包连接

SOCK_RAM:提供原始网络协议

protocol:指定socket传输协议编号,设为0即可

返 回 值:成功返回socket套接字描述符,失败-1

头 文 件:#include <sys/socket.h>

2.bind

函数的作用:绑定IP地址

函数的原型:int bind(int sockfd,struct sockaddr * my_addr,int addrlen)

函数的参数:sockfd:套接字描述符

my_addr:主机地址

addrlen:sockaddr的地址长度

struct sockaddr

{

unsigned short int sa_family;

char sa_data[14];

};

struct sockaddr_in

{

unsigned short sin_family;

uint16_t sin_port;   端口号

struct in_addr sin_addr;   IP地址

unsigned char sin_zero[8];

};

头 文 件:#include <sys/types.h>

#include <sys/socket.h>

返 回 值:成功0;出错-1

3.connect

函数的作用:建立socket连接的通常客户端连接服务器使用

函数的原型:int connect(int sockfd,struct sockaddr * serv_addr,int addrlen);

函数的参数:serv_addr:表示要连接的服务器IP地址

addrlen:struct sockaddr的长度

返 回 值:成功0;出错-1

4.listen

函数的作用:聆听网络,等待连接

函数的原型:int listen(int sockfd,int backlog)

函数的参数:sockfd:描述符

backlog:允许接入的客户端数目

注意:listen并没有连接,只是设置socket的listen模式而已,真正连接的是accept!

返 回 值:成功0,出错-1

5.accept

函数的作用:接收网络的连接,客户端连接,三次握手

函数的原型:int accept(int sockfd,struct sockaddr *addr,int *addrlen);

函数的参数:addr:连接成功填充远端客户机地址

addrlen:struct sockaddr的长度

返 回 值:成功返回新的fd,出错-1

6.send

函数的作用:经过socket传送数据,向对方发送数据

函数的原型:int send(int sock_fd,const void * msg,int len,unsigned int flags)

函数的参数:sock_fd:accept建立起来的socket连接描述符,连接远方的IP地址

msg:发送的数据

len:数据长度

flags:设为0

返 回 值:成功是实际传递出去的字节数,出错-1

7.recv

函数的作用:经过socket接收数据

函数的原型:int recv(int socket_fd,void *buf,int len,unsigned int flag)

函数的参数:sock_fd:accept以后的socket套接字描述符

buf:存放地址

len:接收数据的最大长度

返 回 值:成功:接收的字节数,出错:-1

8.一个例子胜过千言万语:

union MyUnion
{
short value;
char union_bytes[sizeof(short)];
} test; test.value = 0x0102;
if ((test.union_bytes[] == ) && (test.union_bytes[] == ))
{
printf("Big endian. \r\n");//网络字节序,大端对齐(高位在前面)
}
else if ((test.union_bytes[] == ) && (test.union_bytes[] == ))
{
printf("little endian. \r\n");//主机字节序,小端对齐
}
网络字节序,大端对齐(高位在前面)
主机字节序,小端对齐

字节序的转化函数:

头文件:#include <apra/inet.h>

从主机发送到网络:

uint32_t  htonl(uint32_t,hostin32);  //32位数据传送,从主机到网络

uint16_t  htonl(uint16_t,hostin16);  //16位数据传送,从主机到网络

从网络到主机:

uint32_t ntohs(uint32_t netint32);   //32位的数据接收,从网络到主机

uint16_t ntohs(uint16_t netint16);   //16位的数据接收,从网络到主机

9.地址格式的转化

十进制点分形式转化成二进制形式:

inet_addr()

函数的原型:unsigned long int inet_addr(const char *cp);

返 回 值: 成功则返回对应的二进制的数字,失败-1

函数的参数:cp:放置如:”192.168.1.100”的点分IP地址

inet_port()

函数的原型:int inet_pton(int af,const char * src,void *dst)

函数的参数:af:AF_INET,AF_INET6

src:点分的要转化的IP地址

返 回 值:成功1,格式无效0,出错-1

inet_ntop()

函数的作用:二进制地址转换成十进制点分形式

函数的原型:const char * inet_ntop(int af,const void * src,socket_t size)
————————————————
版权声明:本文为CSDN博主「ZM_iTUDOU」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ky_heart/article/details/53057541

Linux 网络通信 API详解【转载】的更多相关文章

  1. linux sar 命令详解(转载)

    linux sar 命令详解 2013-04-01 11:05 [小 大] 来源: 开源中国社区 评论: 0 分享至: 百度权重查询 词库网 网站监控 服务器监控 SEO监控 手机游戏 iPhone游 ...

  2. linux screen 命令详解(转载)

    转载于:http://www.cnblogs.com/mchina/archive/2013/01/30/2880680.html 一.背景 系统管理员经常需要SSH 或者telent 远程登录到Li ...

  3. linux sort 命令详解(转载)

    转载:http://www.cnblogs.com/51linux/archive/2012/05/23/2515299.html#3374576 sort是在Linux里非常常用的一个命令,管排序的 ...

  4. linux awk命令详解--转载

    awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息 awk处理过程: 依次对每一行进行处理,然后输出 awk命令形式: awk [-F ...

  5. Linux下Awk详解(转载)

    什么是Awk Awk是一种小巧的编程语言及命令行工具.(其名称得自于它的创始人Alfred Aho.Peter Weinberger 和 Brian Kernighan姓氏的首个字母).它非常适合服务 ...

  6. linux进程地址空间详解(转载)

    linux进程地址空间详解(转载) 在前面的<对一个程序在内存中的分析 >中很好的描述了程序在内存中的布局,这里对这个结果做些总结和实验验证.下面以Linux为例(实验结果显示window ...

  7. Linux下的I/O复用与epoll详解(转载)

    Linux下的I/O复用与epoll详解 转载自:https://www.cnblogs.com/lojunren/p/3856290.html  前言 I/O多路复用有很多种实现.在linux上,2 ...

  8. Linux启动流程详解【转载】

    在BIOS阶段,计算机的行为基本上被写死了,可以做的事情并不多:一般就是通电.BIOS.主引导记录.操作系统这四步.所以我们一般认为加载内核是linux启动流程的第一步. 第一步.加载内核 操作系统接 ...

  9. 网络编程socket基本API详解(转)

    网络编程socket基本API详解   socket socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信. socket ...

随机推荐

  1. IT兄弟连 Java语法教程 标识符和关键字

    Java语言也和其它编程语言一样,使用标识符作为变量.对象的名字.也提供了一系列的关键字用以实现特别的功能.本小节将详细介绍Java语言的标识符和关键字等内容. 1.分隔符 Java语言里的分号“;” ...

  2. SqlServer ----- 拷贝数据表

    两种方式,第一种方式只是把表中的字段进行拷贝,第二种把表中的关联关系,主键自增长全部拷贝. 1.把表中的关联关系,主键自增长全部拷贝. 选择需要拷贝的表,点击编辑器窗口,会看到这个表的sql 语句,主 ...

  3. antV G2 为柱状图添加背景颜色

    工作中需要在基础柱状图的基础上添加一个自定义高度的背景颜色, 基础柱状图: 目标柱状图: 由于chart绘图可以重叠,通过该特性,我们可以在画两次图重叠在一起,第一次绘图描述背景,第二次绘图描述数据, ...

  4. php 利用curl_*测试数据并发

    工作时遇到一个数据并发问题,因为上线之前没有测试数据并发,导致有时候网络比较差的时候导致数据重复插入数据库 , 所以利用curl_*函数专门写了一个测试数据并发的测试用例,如下: function t ...

  5. 1-函数返回值-return详解及应用-1

    return 返回值   可以是:数字.字符串.布尔.函数.对象(元素\[]\{}\null).未定义  <script> function fn1(){return 100;} aler ...

  6. KB奇遇记(3):糟糕的IT现状

    2015年8月3号,终于告别了过去来到了KB. 公司给安排的住房是一间套房里的小房间,小的简直连坐的地方都没有了,中间一个大床将房间隔了两边,显得特别狭小.由于是刚来,我也不好要求太多.但就这个小房间 ...

  7. INSTALL_FAILED_NO_MATCHING_ABIS解决办法

    解决方法: 在project切换到Android状态下的build.grade(Module:app)中添加如下内容即可: splits { abi { enable true reset() inc ...

  8. 本地Yum源配置

    一.网络源 yum list 软件名称 查找源里的软件,可以使用通配符 二.配置源 源配置文件路径 /etc/yum.repos.d/ 配置项 [名称] 源标识(不能和其他的源重复) name=名称 ...

  9. Linux—网络通讯管理命令

    一.ping命令 . ping 主机名 . ping 域名 [root@localhost ~]# ping www.baidu.com . ping IP地址 [root@localhost ~]# ...

  10. Lnmp架构部署动态网站环境.2019-7-3-1.4

    安装wiki开源产品 一.创建数据库 [root@Lnmp bbs]# mysql -uroot -p123456 mysql> create database wiki; #创建wiki数据库 ...