Linux的网络编程(一) ----Linux的网络通信模型

网络是Linux系统和外部进行数据交互的重要通道,现在将介绍在Linux下使用C语言进行网络相关编程的基础方法,会涉及以下内容:
1.Linux的网络通信模型
2.套接字基础和使用方法
3.在Linux下进行TCP编程的方法
4.在Linux下进行UDP编程的方法
一.Linux的网络通信模型
1.OSI网络模型
计算机网络模型是为了简化网络的研究,设计与实现而抽象出来的一种结构模型,通常采用层次模型。在每个层次模型中,往往将系统所要实现的复杂功能分化为若干个相对简单的细小功能,每一项分功能一相对独立的方式去实现。
*开放系统互连参考模型OSI(Open System Interconnection Reference Mode)*是国际标准化组织(ISO)提出的一个设计和描述网络通信的基本框架,结构如下图所示,包括了物理层,数据链路层,网络层,传输层,会话层,表示层,应用层(共七层)。
物理层:计算机网络的最底层,也是最基础的层,是有关物理设备通过物理媒体进行互联的描述和规定。
数据链路层:该层承担了两个数据设备通过物理层进行无差错传输数据帧的工作。
网络层:该层负责信息寻址,以及将逻辑地址名字转换为物理地址,在网络层中传输的是数据包,其需要选择合适的路径和转发数据包,使发送方的数据包能够正确无误的按地址寻址到接收方的路径,并将数据包交给接受方。
传输层:该层负责不同子网中的两个数据设备之间,数据包可以可靠,顺序,无错的传输,在该层中传输的是数据段,其向高层用户提供端到端的可靠的透明传输服务,为不同进程间的数据交换提供可靠的传送手段
会话层:其是利用传输层提供的端到端服务,向表示层或会话用户提供会话服务。
表示层:其负责在不同的数据格式间进行转换操作以实现不同计算机系统间的信息交换,以及负责编码加密压缩等操作。
应用层:其直接和用户以及应用程序间进行数据交互,包括了大量的应用协议,如Telnet,SSH,DNS,HTTP等。
2.TCP/IP协议和其网络模型
(1)TCP/IP协议的分层:
网络接口层:类似OSI模型中的物理层和数据链路层的集合,主要用于实现数据在我物理上的传输
网络协议层:负责检查网络拓扑结构,以决定传输数据的的最佳路由
传输层:提供了从发送方端口到接收方端口的数据传输协议,最常用的协议是TCP和UDP协议,前者是一个面向连接的协议,提供无差错的字节流的可靠传输,后者是一个不面对连接的协议。
应用层:提供常用的高层协议,包括FTP,TLENET,SMTP,HTTP,DNS。
(2)IP协议规定的IP地址
在IP协议中定义了A.B.C.D共四种主要的地址类
A:第一位固定为0,第一个字节(前8位)为网络标识符,用来标识网络,其余三个字节用来标识网络上的主机,因此最多有127个A类网络,每个A类网络可以容纳1700万台主机。
B:前两位固定为10,第一个和第二个字节(前16位)为网络标识符,用来标识网络,其余两个字节用来标识网络中的主机,因此最多有16000个B类网络,每个B类网络可以容纳65000台主机。
C:前三位固定为110,前三个字节(前24位)为网络标识符,用来标识网络,最后一个字节用来标识网络上的主机,因此最多有200万个C类网络,每个C类网络可以容纳254台主机。
D:前四位固定为1110,D类地址是多目地址,用于标识在网络上运行分布式应用的一群主机,因此,D类主机并不标识一个在线的主机。
3.Linux的端口和套接字
Linux的端口是一个逻辑的概念,其由TCP/IP协议定义,是一个0~65535之间的数字,可以分为常用的“固定”端口和通用端口两个部分。所谓的“固定”端口是指一些常用的软件或者TCP/IP协议中确定和公布的,通常来说不会被其他程序使用。
所谓套接字(Sockets),即网络进程(服务器端程序或客户端程序)的进程ID,和普通的进程ID不同,网络进程的ID是由运行这个进程的计算机的IP地址以及这个进程使用的端口(PORT)所组成的,在同一台计算机上一个端口只能分配给一个进程,所以这样就可以确定网络中计算机上的一个进程
4.Linux套接字的结构定义
Linux在头文件sys/socket.h中定义了一种通用的套接字结构类型,以供不同的协议进行调用,对其说明如下:

struct sockaddr
{
	unsignded short int sa_family;//套接字协议地址类型
	unsigned char sa_data[14];//14字节的协议地址,包括IP地址和端口
}

除了scokaddr之外,Linux还在netinet/in.h中还定义了另外一种结构类型sockaddr_in,对这种类型的说明如下,其和sockaddr等效且可以互相转换,通常来说会在涉及TCP/IP的协议编程中使用。

struct sockaddr_in
{
	int sa_len;//长度单位
	short int sa_family;//地址族
	unsigned short int sin_port;//端口号
	struct in_addr sin_addr;//IP地址
	unsigned char sin_zero[8];//填充0以保持与struct sockaddr同样大小
}

对该结构体中的各个分量说明如下
sa_len:长度单位,不必设置,通常情况下固定长度为16个字节
sa_family:协议族
sin_port:端口号
sin_addr:IP地址,其本身也是一个结构体,对该结构体的描述说明如下:

struct sin_addr
{
	in_addr_t s_addr;//32位IPv4地址,网络字节顺序
}

sin_zero:填充0,目的是为了保持该结构和sockaddr结构同样的大小,以方便转换。
在使用结构sockaddr_in的时候需要注意以下几点:
结构sockaddr_in中的TCP或UDP端口号sin_port和IP地址sin_addr都是以网络字节序存储的。
32位的IP地址可以利用两种不同的方法引用。例如,假设定义变量servaddr为Internet套接字的地址结构,那么可以用servaddr.sin_addr或servaddr,sin_addr.s_addr来引用这个IP地址,需要注意的是前一种引用是结构类型(struct sin_addr)的数据,而后一种引用是整数类型的数据;当将IP地址作为函数参数使用时,需要明确使用哪一种类型的数据,因为编译器对结构类型参数和整数类型参数的处理方式不一样。
sin_zero成员未被使用,他是为了和通用套接字地址(struct sockaddr)保持一致而引入的,通常会被填充为0.
套接字地址结构仅供本机TCP协议记录套接字信息而用,这个结构变量本身是不在网络上传输的,但是其某些内容,如IP地址和端口号是在网络上传输的,这也是为甚麽这两部分数据要转换成网络字节序的原因。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值