在做TCP/IP协议分析的时候,是不是tcp,udp,ip的每一个字段都是网络字节顺序?要想获取其真实的值是不是都要用到ntohs(ntohl ……)函数?还是只有某些字段是网络顺序?

解决方案 »

  1.   

    因为自己正在写一个协议分析的程序  分析出来总觉得udp的总长度实在太大(万级别),有看到别人的源码中取长度时用了ntohs函数来转换 得出的结果和eathereal的结果差不多  
      

  2.   

    每次都要用到类似ntohs函数? or只有某个(就像shenyi0106说的那样,只有ip地址和端口号)?
      

  3.   

    用winsock的库函数,输入值和返回值都是网络字节序
      

  4.   

    不知道你是在哪一层分析的?
    如果在协议层之上,那么直接按照:
    IP协议(20个字节)+TCP协议(20个字节)/UDP协议(8个字节)来分析包
    如果在协议层之下,那么需要在IP协议前加上一个以太网协议(14个字节)
    具体的协议格式,网上都可以搜索到
      

  5.   


    字节顺序是针对大于 1 byte的数据类型而言的。
    IP 地址是4 bytes, Port 是 2 bytes, 当然要做字节顺序转换。
    big-endian(大端字节顺序), little-endian(小端字节顺序)。
    主机字顺序,网络字节顺序,两者取big-endian、 little-endian中的一种,因为主机字节顺序取决于硬件平台, 网络字节顺序取决于 TCP/IP协议栈实现。参考:http://en.wikipedia.org/wiki/Endianness
      

  6.   

    BTW. 优秀的开源协议分析工具 wireshark, 楼主可以用用。
      

  7.   

    我是正在做一个类似sniffer的程序,通过对比我发现,比如说udp的长度的那个字段,没使用ntohs函数是得出的udp长度是万级别的,在使用ntohs函数之后一般1480一下,所以觉得后者正确,但是又问老师,老实说只有端口和ip字段需要转换成本机自己顺序,现在郁闷中……
      

  8.   

    我是用的winsock的raw套接字,ip层
      

  9.   

    真相是:所有非字符串的数据(封包的载荷数据不算),例如2bytes的短整型、4bytes的整型、8bytes的长整型,都存在字节序问题。主要是由于网络上同时存在UNIX、LINUX和Windows造成的,Unix Linux是大尾序的,Windows是小尾序的,所以要转换。