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);