此篇文章发布距今已超过93天,您需要注意文章的内容或图片是否可用!
请问:ICMP协议和TCP、UDP一样,都是封装在IP报文里面的,那么他们三者不应该是同层级的吗,为什么ICMP是三层协议/网络层协议,而TCP和UDP属于四层协议/传输层协议呢?基于BSD (Berkeley Software Distribution ) TCP/IP Source Code的主流操作系统实现, 当“ICMP xxx Request” 到达目的地(Destination IP == One of Interface IP)时,操作系统内核进程(Kenel)根据Request Type直接处理(Reflect),并以“ICMP xxx Reply”消息返回。整个处理过程,和接收端的用户进程(User Process)没有一丝一毫的关联!这样的ICMP还指望它传输(Transport)什么样的用户数据?读者会说,可以用ICMP来传输Ping报文啊,难道Ping报文数据不是用户进程(User Process)的吗?诚然,Ping报文Data在源端(Client)是由Ping用户进程产生的。通过调用SOCK_RAW接口,经由IP_Output(),完成IP层封装,由IP层完成路由并最终将报文发送出去。单从这一点,ICMP和TCP、UDP并没有什么不同,只是它们调用的Socket类型不同。从IP视角看来,它们是自己要运输的货物(Payload)而已。区别是,包裹的颜色(Protocol)不同。
- Protocol =1时,Payload = ICMP
- Protocol =6时,Payload = TCP
- Protocol =17时,Payload = UDP
TCP/UDP封装的用户数据,会依据Protocol =6、17分别分发给TCP_Input、UDP_Input处理,然后根据4元组的matched到特定的PCB(Internet Protocol Control Block),根据PCB指向Socket的地址指针,将Packet放入Socket Input Queue,用户进程就可以使用Recv() System Call将Packet数据从Socket Input Queue队列copy到用户进程buffer。ICMP封装的用户数据,会依据Protocol =1分发给IP_ICMP处理。IP_ICMP会根据Type做switch判断处理。- 将报文Reflect反弹回去,包括Echo Request(Ping报文)、Timestamp Request、Information Requet等等。
- ICMP Redirect,需要Update路由信息
- Source Quench,需要通知TCP用户进程降速
- Error Message,需要通知TCP/UDP进程MTU、TTL、Port Unreachable等等
无论如何,ICMP运输的Data到不了用户进程!!!而上文的TCP/UDP运输的Data可以到达用户进程。TCP、UDP都可以提供传输服务,它们都是传输(Transport)层协议。ICMP,Internet Control Message Protocol,它提供的是网络层(Internet)消息(Message)传递服务。这里的Control区别于用户收发的Data。如果愿意,可以将ICMP Souce Code 修改成可以Attach用户进程,那么ICMP就可以像TCP、UDP一样,用于传输用户进程Data。这里可以将ICMP封装当成ICMP Tunnel。可以轻松Pass防火墙的过滤,从而实现科学上网。当前的防火墙已经发现了这个漏洞,已经修复!- Protocol =1时,Payload = ICMP
- Protocol =47时,Payload = GRE
- Protocol =50时,Payload = ESP
- Protocol =51时,Payload = AH
- Protocol =88时,Payload =EIGRP
- Protocol =89时,Payload =OSPF
试想一下,GRE Tunnel隧道可以传输任何用户数据,为何和GRE平起平坐的ICMP不可以?当然可以,但是需要ICMP Souce Code 修改成可以Attach用户进程。 推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
宙飒天下网-ZhouSa.com
还没有评论,来说两句吧...