主题:原始套接字填IP头的问题
IP数据头以大端点机次序传送,从左到右,版本字段的高位字节先
传输(SPARC是大端点机;Pentium是小端点机)
在IP报头结构里面是这样定义的
ip_hdr STRUCT
ip_hlv BYTE ? ;1个字节
ip_tos BYTE ? ;1个字节
ip_len WORD ? ;2个字节
ip_id WORD ? ;2个字节
ip_off WORD ? ;2个字节
ip_ttl BYTE ? ;1个字节
ip_p BYTE ? ;1个字节
ip_cksum WORD ? ;2个字节
ip_src DWORD ? ;4个字节
ip_dest DWORD ? ;4个字节
ip_hdr ENDS
是汇编的语法定义的结构 和C差不多。我也注明了几个字节的。
我去填这个IP头部呢?
比如ip_hlv里面包含了4位的版本号和4位的头部大小,在内部
是这样储存的00000000 8个2进制位,应该把版本号填在前面
4位 还是填在后面4位呢?而且传输的时候是怎么传输的呢?
比如是一个字节一个字节这样传输的,那么把版本号填在后面4
个位里面 首先传输的就是版本号,但是如果是两个字节两个字
节的传输的话 那么会不会先传输ip_tos里面的数据呢?那就出
错了啊。如果是两个字节传输 那么就要把版本号写在ip_tos的
高字节里面?是这样的吗 我只是举个例,请大家帮下我。
还有就是比如ip_cksum这个是两个字节的,我要不要把这两个
字节里面的数据也要转换一下呢?
顺便附加一个问题。TCP和UDP报头是不是也是像IP头这样的呢?
如果不是的话 我就不明白了。因为在填sockaddr_in结构的时候
要把端口号用htons转换一下。转换成网络字节存储方式。这个
结构里面的端口号是不是将要放在TCP或UDP头里面的目的端口号
呢?因为在IP头里面好象没有端口号吧 。。
传输(SPARC是大端点机;Pentium是小端点机)
在IP报头结构里面是这样定义的
ip_hdr STRUCT
ip_hlv BYTE ? ;1个字节
ip_tos BYTE ? ;1个字节
ip_len WORD ? ;2个字节
ip_id WORD ? ;2个字节
ip_off WORD ? ;2个字节
ip_ttl BYTE ? ;1个字节
ip_p BYTE ? ;1个字节
ip_cksum WORD ? ;2个字节
ip_src DWORD ? ;4个字节
ip_dest DWORD ? ;4个字节
ip_hdr ENDS
是汇编的语法定义的结构 和C差不多。我也注明了几个字节的。
我去填这个IP头部呢?
比如ip_hlv里面包含了4位的版本号和4位的头部大小,在内部
是这样储存的00000000 8个2进制位,应该把版本号填在前面
4位 还是填在后面4位呢?而且传输的时候是怎么传输的呢?
比如是一个字节一个字节这样传输的,那么把版本号填在后面4
个位里面 首先传输的就是版本号,但是如果是两个字节两个字
节的传输的话 那么会不会先传输ip_tos里面的数据呢?那就出
错了啊。如果是两个字节传输 那么就要把版本号写在ip_tos的
高字节里面?是这样的吗 我只是举个例,请大家帮下我。
还有就是比如ip_cksum这个是两个字节的,我要不要把这两个
字节里面的数据也要转换一下呢?
顺便附加一个问题。TCP和UDP报头是不是也是像IP头这样的呢?
如果不是的话 我就不明白了。因为在填sockaddr_in结构的时候
要把端口号用htons转换一下。转换成网络字节存储方式。这个
结构里面的端口号是不是将要放在TCP或UDP头里面的目的端口号
呢?因为在IP头里面好象没有端口号吧 。。