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