linux内核学习之网络篇——IP和TCP结构体源码

今天只是看一下IP协议的结构体和TCP的结构体所控制的字段。

首先看一下IP的字段,就是传说中ip协议中的包头字段。

struct iphdr {#if defined(__LITTLE_ENDIAN_BITFIELD)__u8ihl:4,version:4;#elif defined (__BIG_ENDIAN_BITFIELD)__u8version:4,  ihl:4;#else#error"Please fix <asm/byteorder.h>"#endif__u8tos;__u16tot_len;__u16id;__u16frag_off;__u8ttl;__u8protocol;__u16check;__u32saddr;__u32daddr;/*The options start here. */};

看了之后,设计到的数据类型如下

typedef unsigned char __u8;typedef unsigned short __u16;typedef unsigned int __u32;

通过字段类型,大家可以 当你sizeof(struct iphdr)的时候,结果等于20,。对就是20,包头协议的长度为20。

下面画一个图来的直观一些

大家可以直观的看到图示的结构体字段了。数据就是放在了sk——buf字段中了。

下面是tcp的协议结构体

如下代码

struct tcphdr {__u16source;__u16dest;__u32seq;__u32ack_seq;#if defined(__LITTLE_ENDIAN_BITFIELD)__u16res1:4,doff:4,fin:1,syn:1,rst:1,psh:1,ack:1,urg:1,ece:1,cwr:1;#elif defined(__BIG_ENDIAN_BITFIELD)__u16doff:4,res1:4,cwr:1,ece:1,urg:1,ack:1,psh:1,rst:1,syn:1,fin:1;#else#error"Adjust your <asm/byteorder.h> defines"#endif__u16window;__u16check;__u16urg_ptr;};

相应的图示为

出去可选项,头的长度也是20.

详述一下TCP的包头字段的意思

●源、目标端口号字段:占16比特。TCP协议通过使用"端口"来标识源端和目标端的应用进程。端口号可以使用0到65535之间的任何数字。在收到服务请求时,操作系统动态地为客户端的应用程序分配端口号。在服务器端,每种服务在"众所周知的端口"(Well-Know Port)为用户提供服务。

●顺序号字段:占32比特。用来标识从TCP源端向TCP目标端发送的数据字节流,它表示在这个报文段中的第一个数据字节。

●确认号字段:占32比特。只有ACK标志为1时,确认号字段才有效。它包含目标端所期望收到源端的下一个数据字节。

●头部长度字段:占4比特。给出头部占32比特的数目。没有任何选项字段的TCP头部长度为20字节;最多可以有60字节的TCP头部。

●标志位字段(U、A、P、R、S、F):占6比特。各比特的含义如下:

◆URG:紧急指针(urgent pointer)有效。

◆ACK:确认序号有效

◆PSH:接收方应该尽快将这个报文段交给应用层。

◆RST:重建连接。

◆SYN:发起一个连接。

◆FIN:释放一个连接。

●窗口大小字段:占16比特。此字段用来进行流量控制。单位为字节数,这个值是本机期望一次接收的字节数。

●TCP校验和字段:占16比特。对整个TCP报文段,即TCP头部和TCP数据进行校验和计算,并由目标端进行验证。

●紧急指针字段:占16比特。它是一个偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。

●选项字段:占32比特。可能包括"窗口扩大因子"、"时间戳"等选项。

TCP最为经典的就是三次握手了,网上百度一大推,大家可以自己去看。

不说了就这些

更多文章,欢迎访问http://blog.csdn.net/wallwind

初初尝试着拥抱的人,一派新鲜幸福都来不及沉浸,

linux内核学习之网络篇——IP和TCP结构体源码

相关文章:

你感兴趣的文章:

标签云: