近来做了一个网络工具项目, 发现网络知识在整个项目中起到了举足轻重的作用,同时也能加深对网络知识的了解, 也能更深层次地理解《Linux高性能服务器编程》中书的知识点。 那么来说说该怎么学习一下网络编程。
首先,肯定是要学习协议, 但是个人建议先把代码运行起来,同时配合使用tcpdump或wireshark来学习。 wireshark有图形化界面,更好操作。
内容大致分为三部分,第一部分为Socket网络API以及搭建简易的服务器代码。 第二部分为涉及到的网络知识以及拓展知识。 第三部分,wireshrk等工具的使用。
第一部分:
主要是计算机网络知识以及相应的网络编程中的socket等API。
必备的知识点有:大小端字节序。
大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。
小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。
上面这段文字都快背烂了, 但是为什么是这样?以及怎么用才是关键!!!
网络字节序用的是大端模式, PC一般用的是小端模式。
一般以4字节(32位)为一个翻转单位,
以wireshark中的数据为例,wireshark中已经将数据从大端模式转换为了小端模式。
其中IP协议中源端口占32位(4字节), 源地址IP为10.14.15.218(点分十进制表示), 其中.只是为了更方便阅读,实际存储中.并不存在。小端存储为为0A 0E 0F DA。 大端存储为 DA 0F 0E 0A。
大小端参考转换参考代码为:
#include <stdio.h>
int main()
{
unsigned int data = 0xDA0F0E0A;
unsigned int tmp1 = data & 0xFF000000;
unsigned int tmp2 = data & 0x00FF0000;
unsigned int tmp3 = data & 0x0000FF00;
unsigned int tmp4 = data & 0x000000FF;
data = (tmp1 >> 24| tmp2 >> 8 | tmp3 << 8 | tmp4 << 24);
printf(" data: %0x\n", data);
return 0;
}
网络编程的套接字(socket)的几个重要函数。 服务端:socket() bind() listen() accpet () 客户端: socket() connect()。
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
socket() 用来创建套接字。 它有三个参数。
domain代表使用哪个底层簇协议,对于TCP/IP协议簇来说,AF_INET和AF_INET6分别代表IPv4以及IPv6。
type代表服务类型。 有SOCK_STREAM和SOCK_UGRAM, 分别代表TCP协议和UDP协议。
protocol一般设置为0.
那么这里就要讲解一下IP协议。 IPv4用了点分十进制, .在实际中并不存在,只是用来方便阅读, 这里提及一点,在数据库中存储IP,应该用Int类型,而不是vchar类型, 这样可以节省内存空间,这就是MySQL调优中的建表优化。
IPv4头部结构
domain参数就会设置IPv4头部中的版本的数据, type就会设置协议的数据。
IPv6头部结构
区分IPv4和IPv6的方法,就是直接读取IP头部的前四位,前四位的值为0x04则为IPv4协议,值为0x06则为IPv6协议。
读取IP头部报文伪代码如下:
void ParseIPHeader(char **IPPacket)
{
char *ptr;
int version = 0;
int protocol = 0;
memset(version, ptr, 4);
memsete(protocol, ptr + 72, 4);
}
对于IPv4而言, 头部长度有多少字节呢? 好好想一想, 20字节? 错, 是最少20字节, 头部固定长度还需要加上可选字段的长度,最大是60字节。 但是一般没人用可选字段。 所以要知道IP头部有多长, 那么就需要再向后读取四位,读取首部长度,首部长度的单位是4字节, 四位的取值是0x5 - 0xf,也就是5-15, 15 * 4 = 60字节。 所谓的区分服务,就是指在IP层之上承载的传输层协议,ICMP为1,TCP协议为6, UDP协议为17。
现在要提及一个概念:五元组。 五元组是通信术语。通常是指源IP地址,源端口,目的IP地址,目的端口和传输层协议。
五元组确定唯一一条流。
// TODO 待续, 会持续总结完。