TCP、UDP、ICMP的一些疑问的解答 AlexBao 2017.09.06 TCP、UDP、ICMP的一些疑问的解答 这段时间在看如果在移动端用ping工具来测试网络,发现对ICMP,TCP,UDP协议层没有完全理解,所以再仔细看了下,简单整理如下。
1.ICMP到底是什么,它是UDP实现的还是TCP实现,如果不是,那又是什么实现的。 根据ICMP通用的解释,它是IP层的应用协议,与UDP或者TCP的协议有所不同。也就说它的实现既不是TCP协议,也不是UDP协议,它是单独实现的一层。以前一直以为网络上使用的协议不是TCP的,那就是UDP的,现在才发现不是这样的,TCP和UDP只是通用的更上层的协议栈,ICMP也是基于IP协议的上层协议,有点类似TCP和UDP的位置。
2.ICMP用socket实现的时候,如何区分它是ICMP协议呢。 以下是针对IPv4的环境的讨论,IPv6会有相应的字段。 socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP);//创建socket()需要传递family、type、 protocol这3个参数,这里的type需要指定为SOCK_DGRAM,表示它是无面向连接的传输,类似UDP,protocol指定为IPPROTO_ICMP IP层上层的协议是ICMP协议。这个在IP首部专门有一个字节是表示协议类型的,会被指定为ICMP协议。 然后就是根据协议的细则添加各字段了。这里需要注意的是Ping工具实现需要在ICMP的header里面指定type为8 表示是ping的request,指定为0表示ping的reply。
3.网上有些说type指定为SOCK_DGRAM是基于UDP协议,SOCK_STREAM是基于TCP协议实现,这样的说法准确吗? “http://www./default/SOCK_STREAM与SOCK_DGRAM的区别/” 有些网上直接说“SOCK_DGRAM是基于UDP的,SOCK_STREAM是基于TCP的” 我觉得这种说法是有问题的。SOCK_DGRAM只是数据包传输,它各个数据包没有必然的顺序关系,而SOCK_STREAM是有顺序关系的。UDP只是基于SOCK_DGRAM来实现,而不是说SOCK_DGRAM就等于UDP。
4.如果ICMP这种方式已经可以发送数据了,为啥还需要TCP,UDP呢。 经过抓包发现UDP的头部只有8个字节,其中两个字节的源端口和两个字节的目的端口,还有2个自己的数据长度和2个字节的校验和。我们会发现UDP的实现真的很简洁,没有其他的东西。但它标识了端口号,这就是通用传输数据需要的。当然TCP不仅仅有端口号,还有其他很多保证数据可靠性的字段,会复杂很多。而ICMP只是IP层面的IP数据可达性的应用,所以没有端口号。 |
|