前言
大学学的时候就很混乱,搞不清楚…迷迷糊糊,混混沌沌混过了考试,最近用到,需要了解一些,所以就好好地又理解了一波,可能还不是非常清楚,但是!!比以前清楚很多就是了…
问题
我不清楚的实在太多了,完全是小白…so…我会有很多可能超级简单,超级弱智的问题…带着这些问题去理解一下。
wireshark
抓包的时候是怎么知道不同流量包是属于同一个流的,就是那个stream
;wireshark
是怎么处理http
这样的应用层的协议的,追踪http
流和追踪tcp
流有啥区别;- 要怎么在命令行通过
tcp
或者udp
去发送一个文件,或者其他东西; - 什么情况下会分包,发送分包和接收分包都是怎么处理的?之前看到有说接收分包是有什么算法?
ICMP IGMP
是以IP
数据包的形式传输的,但是他们是网络层的协议,跟IP
位于同一层,那么他们还会包括UDP TCP
的包…那这个包是{IP{ICMP{TCP/UDP}}}
这样的形式?- …暂且想不起来了…
理解
虽然题目定的是TCP/IP
理解,但其实只理解了几个协议而已,理解多少写多少吧。把这两天看到的稍微(真的只是稍微)整理一下。
数据链路层
网络层
ARP
ARP
协议的作用是将IP
地址和MAC
地址对应起来,它告诉数据链路层要传送信息的地址,IP
协议告诉数据链路层要传输的数据。
IP
(对于IP
协议最不理解的地方就是分片和重组了…所以就重点说一下这个。我可能只记录了我自己不理解的地方,没有全部详细介绍)
IP(Internet Protocol)
是一种不可靠的协议,它把数据包发送出去,这个协议本身是不会管到底有没有送达的。在这一层中可能会对数据包进行分片:如果上层数据长度超出MTU
,就会分片,但是分片时,仅仅是对数据包进行切分,假如说上层的数据包是UDP
的包,那切分之后只有第一个分片才包含UDP
的头信息,其他分片都只是纯粹的数据信息。
协议格式中,Identification
是表示了分片是属于同一个IP
包的,Fragment Offset
标识了不同的分片在原本的IP
包中的相对位置。这个也很好理解。Flags
里面会有一个MF
标志告诉接收端是否为最后一个IP
分片。接收端在接收到最后一个分片之后,会根据这个分片的数据长度以及它的片偏移来计算分片前整个数据包的长度。然后等待接收具有相同Identification
的分片,等到收齐之后再进行重组。(还看到有说是接收端定义一个适合的数据结构,接收到某一Identification
的分片,放到数据结构里,再接收到时,根据偏移来方便插入,直到所有的分片都到达接收端。感觉只是实现上的不同,原理上都是一样的,根据MF/Identification/Fragment Offset
)
接收端会设立一个缓冲区,并且有一个定时器,在一定时间内所有的分片还没有到达的话,就会把缓冲区中已经接收到的分片全部丢弃。这也是IP
协议不可靠的一个体现。
分片以及重组的过程对于上层协议都是透明的。TCP
是有它自己的机制来避免造成IP分片的,而UDP
是不管它产生的数据长度的。(对于TCP
来说叫分段,IP
叫分片…不管这些具体的叫法了,重点是理解。)
ICMP
看的最多的就是ICMP
协议了,一直都不知道这到底是个啥东西,虽然一定查过。Internet Control Message Protocol
,因特网控制报文协议,这个协议属于网络层,但是从报文形式上来说,它是包含在IP
包里的,是属于IP
协议的上层协议,但是由于这个协议是为了辅助IP
协议而生的,所以就被多数认为是属于网络层。(这是最开始对它的一个疑问…)上面也提到了IP
协议是不可靠的,ICMP
的产生就是为了缓解IP
协议的不可靠性。比如说:在IP
数据包无法送达,或者TTL
为0,路由器要丢掉IP
包时,路由器会发送一个ICMP
包,告诉发送主机:你的IP
包因为什么什么原因,无法到达。
找到一篇讲ICMP
讲的很好的帖子。
ICMP
的数据包分为两种:信息查询和差错通知。对应有两种经典应用,一个是ping
,用来查询目的主机是否可达;另一种是traceroute
,用来查询IP
包传输过程中都经过哪些路由。
在写网络嗅探器的过程中还有一个疑问:ICMP
是网络层,那它的数据包里还会不会有TCP
或者UDP
的包??
先贴出ICMP
数据包的格式。
类型,代码两个组合在一起,表示这个ICMP
包是传递了什么样的信息,主机不可达,或者端口不可达,等等。在上面给出的那个帖子中,有给出具体的列表。
选项数据部分可能会根据需要,包括标识符和序列号等信息,这里就不具体说了。ICMP
包的数据信息,会根据要传递信息的不同,携带不同的内容。
那上面提出的问题就有解答了,IP
数据包包含ICMP
数据包,ICMP
数据包可能会包含UDP
的数据包。再给一下wireshark
抓包的截图…(我不知道这算不算是一个关键问题,但我对这个一直很疑惑??)
上面这个图是在执行ping
指令的时候产生的流量包信息。可以看到在ICMP
的头信息之后是标识符和序列号,然后就是ICMP
的数据信息了,是不包含其他的协议数据包的…
从上面那个帖子里抄过来的
1.向目标服务器发送回送请求。
首先,向目标服务器发出回送请求(类型是8,代码是0)报文。在这个回送请求报文里,除了类型和代码字段,还被追加了标识符和序号字段。标识符和序号字段分别是16 位的字段。ping 命令在发送回送请求报文时,在这两个字段里填入任意的值。对于标识符,应用程序执行期间送出的所有报文里填入相同的值。对于序号,每送出一个报文数值就增加1。而且,回送请求的选项数据部分用来装任意数据。这个任意数据用来调整ping 的交流数据包的大小。
2.鹦鹉学舌一样返回回送回答。
计算机送出的回送请求到达目标服务器后,服务器回答这一请求,向送信方发送回送请求(类型是0,代码是0)。这个ICMP 回送回答报文在IP 层来看,与被送来的回送请求报文基本上一样。不同的只是,源和目标IP 地址字段被交换了,类型字段里填入了表示回送回答的0。也就是,从送信方来看,自己送出的ICMP 报文从目标服务器那里象鹦鹉学舌那样原样返回了。
送信方的计算机可以通过收到回送回答报文,来确认目标服务器在工作着。进一步,记住发送回送请求报文的时间,与接收到回送回答报文的时间一比较,就能计算出报文一去一回往复所需要的时间。但是,收到的回送回答报文里写的只是类型和代码的话,发送方计算机将无法判断它是否是自己发出去请求的回答。因此,前面说到的标识符和序号字段就有它的意义了。将这两个值与回送回答报文中的相同字段值一比较,送行方计算机就能够简单地检测回送回答是否正确了。执行ping 命令而调查的结果没什么问题的话,就将目标服务器的IP 地址,数据大小,往复花费的时间打印到屏幕上。
这个图是在端口不可达的情况下,产生的ICMP
包,可以看到,这个包中包含了IP
数据包的一些头信息,以及UDP
的头信息。这和那个帖子中提到的端口扫描功能是对应的。
向希望调查的服务器发送端口号被适当指定了的UDP 数据包。
这样,目标端口没开着的话,服务器就返回ICMP 端口不可达报文。
返回的ICMP 数据包的选项数据字段里放入着,送信方送出的UDP 数据包的IP 首部与UDP 首部的头8 个字节。
送信方通过这个信息来辨别该错误通知是针对哪个UDP 数据包的,并判断端口是否打开着。
嗯哼?
(就说为啥看到的不同的帖子给出的ICMP
协议格式还不一样…原来是因为实现不同功能的时候,会有不同的字段)
终于更加理解了ICMP
协议。
IGMP
这个没有具体的了解,只知道这个协议的数据也是以IP
数据格式传输的。IP
包的协议字段会标识数据包中到底包含的是什么协议,ICMP
或者TCP
UDP
还是IGMP
。
传输层
应用层
还没有看…??
解答
说一下我现在对上面那几个问题的理解吧。
4、5在上面已经说过了,1的话我现在觉得:因为每次通信的端口号和ip
地址都是确定的,wireshark
应该是通过判断端口号和地址来判断是不是属于同一次通信。
追踪TCP
流和追踪HTTP
流的差别…emmm…没找到,就看到一个说最好是选择追踪TCP
流。
参考: