网络-程序框架

95 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Linux 网络程序

目标

网络协议:ipv4 ipv6 icmp arp  ospf rip igmp mpls pppoe ptp...  
	1. 网络数据分析   直接分析数据包---抓包分析  
	2. 协议图 (静态 动态)
网络服务器模型:  
	1. 数据通信模块  
  		1.1 阻塞接收  
		1.2 非阻塞接收
		1.3 IO复用接收 select poll epoll 
		1.4 异步接收 signal sigation 
	2. 数据处理模块
		2.1 多进程数据处理能力
		2.2 多进程的IPC	
			有名管道
			无名管道
			信号
			消息队列
			信号量
			共享内存
			域socket
		2.3 多线程数据处理能力
		2.4 多线程的互斥与同步
			  mutex 
			  spin
			  rwlock
			  condition
		2.5 多线程多进程(线程池 任务池)
	3. 数据存储模块
	4. 网络服务器设计框架
		4.1 reactor
		4.2 practor
	5. 功能协议实现
		5.1  http
		5.2  https
		5.3  ftp 
		...
	6. 功能框架
		6.1  web服务器框架 

网络协议

一切应用层的功能,都是内核层实现 Linux中都是面向对象的思想

aaaaa --> fd ----> open(/tmp/test.txt)--->write---->read
aaaaa -->socket ----> socket()-->write---read---accetp--connect--setsocketopt

网络编程的基础知识 
* TCP/IP协议镞 
	1. 分层的概念 
		物理层 :PCS(物理编码层) PMA(物理适配层)  
		LLC层  :局域网链路问题  ARP   
		IP层   :网络传输问题   
		TCP层  :进程接收数据
		应用层 :HTTP HTTP FTP TELNET SSH  
	2. ip 格式
	   点分十进制  二进制
	   网络字节序(大端序)  本地字节序(小端序 )
	   0x12345678
	   0x78 0x56 0x34 0x12

	   case 1: 点分十进制------>网络字节序的二进制 
		in_addr_t inet_addr(const char *cp);
	   case 2: 网络字节序的二进制 --->点分十进制
	    char *inet_ntoa(struct in_addr in);
	   case 3:点分十进制------>网络字节序的二进制 
	    int inet_aton(const char *cp, struct in_addr *inp);
	3. 子网掩码
	   24  11111111111111111100000000
	   255.255.255.0 
	   ip---->ip段 
	   192.168.1.1 --->192.168.1.1/24
	4.拆包和封包 
		HTTP协议

tcp的编程原理和编程流程 
	监听句柄-->接收新的链接--->电话号
	链接句柄-->接收新的客户端--->呼入电话

socket模型

五元组:源IP 目的IP 源port 目的port 类型type

1.创建对象

fd=socket(协议簇,类型,协议)
int  socket(int protofamily, int type, int protocol);//返回sockfd
协议族:
	AF_INET
	AF_INET6
	AF_LOCAL
	AF_ROUTE
套接字类型
	SOCK_STREAM
	SOCK_DGRAM
	SOCK_RAW
协议:
	IPPROTO_TCP
	IPPTOTO_UDP
	IPPROTO_SCTP
	IPPROTO_TIPC
2.设置对象

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

地址填充 ,端口填充使用
struct sockaddr_in {
	 sa_family_t    sin_family; /* address family: AF_INET */
	 in_port_t      sin_port;   /* port in network byte order */ short 
	 struct in_addr sin_addr;   /* internet address */		
};
struct in_addr {
	    uint32_t       s_addr;     /* address in network byte order */
};

字节序概念
	本地字节序
	网络字节序
	htons()
	htonl

	hton
	htons(80)
    ntohs
	ntohl
			
0x5689
x86 win   小端序  89 56
x86 linux 大端序  56 89 
	   网络字节序 大端序

发送构造数据包   本地字节序---->网络字节序
接收解析数据包   网络字节序---->本地字节序 

192.168.1.1  点分十进制ip地址 
unsigned int ip 	

 点分十进制 转化为无符号整形;
 int =inet_addr(str)
 无符号整形转化为点分十进制 
 str=inet_ntoa(uint32_t s_addr)
3.使用对象
listen(fd,100);
socket_fd=accpet(fd)

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                    struct sockaddr *src_addr, socklen_t *addrlen);
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                  const struct sockaddr *dest_addr, socklen_t addrlen);