从底层协议的角度来浅谈Linux网络编程(未完待续)

    近来做了一个网络工具项目, 发现网络知识在整个项目中起到了举足轻重的作用,同时也能加深对网络知识的了解, 也能更深层次地理解《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 待续, 会持续总结完。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值