- TCP/IP网络简介
- Linux中TCP/IP网络结构
- 套接字接口
- Socket编程
- 网络字节
- 数据报通信流程(UDP通信)
- UDP编程API
- UDP编程实例
网络简介
TCP/IP参考协议模型
OSI参考模型
两种参考模型的对应关系
————————————————————————————
TCP/IP实际上是一个一起工作的通信家族,为网际数据通信提供通路。为了方便,将TCP/IP协议组大体上分为三部分:
- 1.Internet协议(IP)
- 2.传输控制协议(TCP)和用户数据报文协议(UDP)
- 3.处于TCP和UDP之上的一组协议专门开发的应用程序等。
- TELNET
- FTP (文件传输协议)
- DNS (域名服务)
- SMTP(简单的邮件传送程序)
网络层
第一部分也称为网络层。包括Internet协议(IP)、网际控制报文协议(ICMP)和地址识别协议(ARP)。
- Internet协议(IP)
- 该协议被设计成互联网分组交换通信网,以形成一个网际通信环境。它负责在源主机和目的主机之间传输来自其较高层软件的称为数据报文的数据块,它在源和目的地之间提供非连接型传递服务。
- 网际控制报协议(ICMP)
- 它实际上不是IP层部分,但直接同IP层一起工作,报告网络上的某些出错情况。允许网际路由器传输差错信息或测试报文。测试网络比如通过ping命令。
- 地址识别协议(ARP)
- ARP实际上不是网络层部分,它处于IP和数据链路层之间,它是32位IP地址和48位局域网物理地址之间执行翻译的协议。
传输层
第二部分是传输层协议。包括传输控制协议和用户数据报协议。
- 传输控制协议(TCP)
- 由于IP提供非连接型传递服务,因此TCP应为应用程序存取网络创造了条件,使用可靠的面向连接的传输层服务。该协议为建立网际上用户进程之间的对话负责。此外,还确保两个以上进程之间的可靠通信。它所提供的功能如下。
- 监听输入对话建立请求
- 请求另一网络站点对话
- 可靠的发送和接收数据
- 适度的关闭对话
- 由于IP提供非连接型传递服务,因此TCP应为应用程序存取网络创造了条件,使用可靠的面向连接的传输层服务。该协议为建立网际上用户进程之间的对话负责。此外,还确保两个以上进程之间的可靠通信。它所提供的功能如下。
- 用户数据报协议(UDP)
- UDP提供不可靠的非连接型传输层服务,它允许在源和目的地站点之间传送数据,而不必在传送数据之前建立对话。此外,该协议还不使用TCP使用的端对端差错校验。它主要对于那些不要求TCP协议的非连接型的应用程序。例如:域名服务,网络管理、视频点播和网络会议等。
在TCP/IP模型中,上层功能的实现要依赖下层提供的服务,如在底层是以太网的TCP/IP网络体系中,IP分组的传送要封装在以太网帧中,而TCP/UDP包的传送又是封装在IP分组的data中实现的。发送信息的时候,信息经过一层协议层就加一层。。。接收信息时经过一层就剥一层。。。。。
可以想象,整个的数据包就像一个洋葱,一层一层的外面没有用的协议层包着中间的有用的数据。
嵌入式Linux中TCP/IP网络结构
在Linux操作系统中,socket属于文件系统的一部分,网络通信可以被看作是对文件的读取。这就使得用户对网络的控制像对文件的控制一样方便。
###套接字接口
网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符,它也有类似对文件操作的函数调用,如完成打开、读/写等操作。
在TCP/IP协议地址族中,按照提供服务的层次关系,套接字有BSD和INET之分。
- BSD套接字接口
- 套接字接口(又简称套接口)是为了方便开发人员进行TCP/IP程序开发,而为TCP/IP协议所开发的一组应用程序接口。由于它最早应用于伯克利大学的BSD UNIX中,所以人们又把它称为BSD socket(简称BSD)。
- Linux BSD套接字支持下列套接字类型:
- Stream (掌握)
- Stream(流)套接字提供可靠的双工顺序数据流,能保证传输过程中数据不丢失,不被弄混和复制。Internet地址中的TCP协议支持Stream套接字。
- Datagram (掌握)
- Datagram (数据报)套接字提供双工数据传输,但这与Stream套接字不同,它是不可靠的,不保证信息的到达。
- Raw
- 利用Raw套接字可以直接处理下层协议(所以叫Raw(生的、没熟的))
- Stream (掌握)
- Socket编程基础
- 客户机/服务器模式
- 在网络上大部分的通信都是在客户机/服务器模式下进行的,利用socket实现通信也不例外。客户机/服务器模式中,将请求服务器的一方称为客户端,而将提供服务的一方称为服务端。
- socket编程相关数据结构
- 套接口描述符
- 一个套接口描述符只是一个整型的数值,它的定义为intsockfd。
- sockaddr数据结构
- sockaddr数据结构中保存着套接口的地址信息,它的定义为:
struct sockaddr
{
unsigned short sa_family;//地址族,定义为AF_XXXX
char sa_data[14];//14字节的协议地址
}
- sa_family中可以是其他的很多值,但一般把它赋值为“AF_INET”
- sa_data则包括一个目的地址和一个端口地址
- sockaddr数据结构中保存着套接口的地址信息,它的定义为:
- sockaddr_in数据结构
- sockaddr_in 数据结构的定义为:
struct sockaddr_in
{
short int sin_family;//地址族
unsigned short int sin_port;//端口号
struct in_addr sin_addr;//IP地址
unsigned char sin_zero[8];//填零用来保持与struct sockaddr 同样大小
}
sockaddr和sockaddr_in两个数据类型是等效的,可以相互转换,通常使用sockaddr_in更为方便。
- sockaddr_in 数据结构的定义为:
- 客户机/服务器模式
网络字节顺序
因为每一个机器内部对变量的字节存储顺序不同(有的系统高位在前、低位在后,而有的系统是低位在前,高位在后),而网络传输的数据大家是一定要统一顺序的。
- htons():表示“Host to Network Short”,把主机地址字节顺序转向网络字节顺序(对短型数据操作)。
- htonl():表示“Host to Network Long”,把主机地址字节顺序转向网络字节顺序(对长型数据操作)。
- ntohs:表示“Network to Host Short”,把网络字节顺序转向主机地址字节顺序(对短型数据操作)。
- ntohl:表示“Network to Host Long”,把网络字节顺序转向主机地址字节顺序(对长型数据操作)。