分类: 嵌入式
2014-08-20 14:41:13
主要内容有:推荐书籍《UNIX环境高级编程》,简称AQUE.以及华清教学课件“Linux网络编程”部分。
(1)OSI模型和TCP/IP协议的模型
(2)TCP和UDP协议下的服务器和客户端的设计
(3)I/O模型
(4)服务器模型
(5)广播和组播模型
(6)UNIX域套接字
一、OSI模型和TCP/IP协议的模型
TCP/IP协议中,TCP是用来检测网络传输中差错的传输控制协议,IP协议专门负责对不同网络进行互联的互联网络协议。他们的前身是美国的ARPnet的NCP协议。
网络的体系结构是指“网络的层次结构”和每层所使用的协议的集合“。 最重要的两个网络体系结构是:TCP/IP和OSI
面向通信 --> 传输层 --> 差错处理/恢复,流量控制,提供可靠的数据传输
通信子网 --> 网络层 --> 数据的分组和路由的选择
通信子网 --> 链路层 --> 数据组成可发送\接受的帧
通信子网 --> 物理层 --> 传输物理信号\接口\信号心事\速率
TCP协议中只有一下四层:
应用层\传输层\网络层\网络接口和物理层
常见的TCP/IP协议族有:
TCP、IP、UDP、ICMP、SMTP、SNMP、HTTP、TFP、ARP
TCP的数据包的格式
二、TCP和UDP协议下的服务器和客户端的设计
(1)TCP和UDP的区别,虽然都工作在传输层,全双工
TCP:可靠,有连接;数据无误、无丢失、无失序、无重复到达。
UDP:不可靠,无连接;效率很高
(2)socket的介绍,sock位于传输层和会话层
分为三种套接字:sock_stream、sock_dgram和sock_ram(原始套接字)
(3)IP地址:我们平时用的是十进制的点分形式,而最后都会转换为一个无符号的32位整数
常用函数:
inet_aton(); //将字符串转换为32位的网络字节序数
inet_addr(); //将字符串转换为32位的网络字节序数
inet_ntoa(); //转换为32位的网络字节序数转换为点分十进制的字符串
(4)端口号:
常用函数:
主机字节序 --> 网络字节序
htonl(); //用于IP
Htons(); //用于端口号
网络字节序 --> 主机字节序
ntohl();
ntohs();
(5)网络字节序:是大端的。
(6)socket地址相关的数据结构
A、通用地质结构
struct socketaddr
{
u_short sa_family;//地址协议族,AF_XXX
char sa_data[14] //14字节协议地址
};
B、Inetnet协议地址结构
struct socketaddr_in
{
u_short sin_family;
u_short sin_port;
struct in_addr sin_addr; //ipv4地址,4byte
char sin_zero[8]; //8tyte 作为填充
};
C、IPV4的地质结构
struct in_addr
{
in_addr_t s_addr; //u32 network address
};
(7)TCP服务器的设计
A、创建socket文件描述符 sockfd = socket(AF_INET, SOCK_DGRAM, 0);
B、填充地址结构
bzero(&peeraddr, sizeof(peeraddr));
peeraddr.sin_family = PF_INET;
peeraddr.sin_port = htons(atoi(argv[2]));
peeraddr.sin_addr.s_addr = inet_addr(argv[1]);
C、将文件描述符和地质结构进行绑定 bind();
D、设置监听套接字,因为sockfd只能用来连接,不能通信 listen(listenfd);
E、得到一个建立好的套接字来连接 int new_fd accept();
F、数据的发送和接收
send()/recv()
(8)TCP客户端的设计
A、同样创建socket文件描述符 sockfd = socket(AF_INET, SOCK_DGRAM, 0);
B、填充地址结构
bzero(&peeraddr, sizeof(peeraddr));
peeraddr.sin_family = PF_INET;
peeraddr.sin_port = htons(atoi(argv[2]));
peeraddr.sin_addr.s_addr = inet_addr(argv[1]);
C、这歌绑定是可选的,将文件描述符和地质结构进行绑定 bind();
D、同服务器的accept一样,客户端也有一个专门的connect(sockfd),得到一个建立好的套接字来连接.
F、数据的发送和接收
send()/recv()