今天天气不错。
Internet控制信息协议(ICMP),在结构上是属于传输层的,但在实际的功能上它是属于网络层的,是IP层的组成部分。ICMP协议为IP数据报提供传输过程中遇到的路由和传送错误报告。
ICMP消息在以下几种情况发送:当数据报不能到达目的地时,当网关已经失去缓存功能时,当网关能够引导主机在更短路由上发送时。
IP并非设计为绝对可靠,这个协议是为了当网路出现问题时返回控制信息,而不是使IP协议变得绝对可靠,并不保证数据报或控制信息能够返回。一些数据报仍将在没有任何报告的情况下丢失。上层协议必须使用自己的差错控制程序来判断通信是否正确。ICMP信息通常报告在处理数据报过程中的错误。若要避免信息无限制地返回,ICMP消息不会单独成包发送,而且ICMP信息只在处理数据报偏移量为0时发送。
ICMP消息以基本IP报头发送。下面是ICMP的封装。
- 类型:长度1字节,表示该ICMP帧的类型。ICMP信息既是一份差错报文,又是查询报文。
- 代码:长度1字节,表示在该类型下的错误代码。只有差错报文才有,其它都为0
- 校验和:长度2字节,表示整个ICMP帧的16位校验和,计算范围是ICMP的类型开始到数据末尾结束。计算方法与IP的校验和相同。计算方法与IP的校验和相同。
- 特定类型的数据:几乎每个类型的数据都不相同,长度也不一。
IGMP数据报
Internet组管理协议(IGMP)在IP主机上应用,并向任一个邻近的路由器报告它们的组播成员关系。该备忘录仅描述了IGMP在主机和路由器之间如何确定成员关系,此路由器和组播成员主机的行为相反。IGMP也可以用于两个路由器之间。
同ICMP一样,IGMP也是IP的一个组成部分。它要求在所有想接收IP组播的主机都要实现IGMP。IGMP消息封装在IP报文中,其IP的协议号为2.在该文档中所有说明了的IGMP消息均会用TTL为1进行传递,并在IP头中包括了IP路由检测选项。
TCP协议
TCP协议全称是传输控制协议,从TCP/IP这个名字即可知道TCP的分量。以4部分讲述TCP协议。TCP协议帧的基础;TCP的连接;TCP的流量控制;TCP的超时和重发。
1) TCP协议帧的基础
- 面向连接:TCP协议规定,在进行数据传输之前2个及诶单必须使用TCP连接的建立过程,建立连接成功后再进行数据传输。终止连接也要使用TCP连接中断过程关闭连接。
- 双向传输:TCP协议中,每个连接都有2个逻辑管道,一收一发。数据可以同时进行收和发,TCP报头包含传出数据和确认输入数据的序列号。
- 可靠传输:TCP协议规定,在传输数据时要按顺序发送数据,并需得到接收方的确认,没有得到确认的数据将重发,接收方接收到的重复包将被丢弃,失序包将被还原为正确的序列。TCP校验字提供比特级的完整性校验。
- 数据字节流:在TCP的输入和输出逻辑管道上传输的数据被认为是连续的字节流,TCP报头的序列号和确认号都是以字节为单位确定的。TCP不知道所传输的字节流的内容是什么,以及在哪里开始,在哪里结束,对字节流数据的分析只能通过应用层的协议进行分析。
- 流控制:TCP协议中还规定了数据传输的流量控制,防止堵塞。在数据传输的双方都有接收缓冲区,如果一方接收缓冲区已满,另一方将不再发送,直到缓冲区有空余空间。而双方的缓冲区都是独立的,永远也不会溢出。
- 应用层数据分段:TCP建立连接时,双方都交换可接收的最大段,如果接收到ICMP的”路径最大传输单位“MTU消息,就能自动调整TCP最大段的大小。
- 一对一传输:TCP协议只能实现一对一,而UDP协议可以提供一对多服务。
总结以上几点,TCP协议为上层的应用层协议提供了可靠的数据传输服务,使用TCP传输的有HTTP,FTP,SMTP等一些不提供可靠数据传输的应用层协议。
说说TCP帧的结构。TCP帧分为两部分:报头和有效负载。TCP报头的长度是可以改变的,最小长度是20字节(在没有选项和填充时)。
TCP报头有以下字段:
(1)
源端口:长度为2字节。标识源应用层协议。如80(HTTP服务器端口)20和21(FTP服务器端口)、23(TELNET服务器端口)等。应用层协议的服务器端一般在已知的端口上接听,而应用层协议的客户端只对默认的服务器端口进行访问。
(2)
目标端口:长度为2字节,标识目标应用层协议。IPO报头的目标IP地址加上TCP报头的目标端口组成全局唯一而有效的地址,1个IP地址加一个端口号就称为一个SOCKET。
(3) 序
列号(ISN):长度4字节,表示本TCP帧中有效数据的第1个字节的基于输出字节流的序列号,即使没有有效数据也要设置序列号,这时它等于下一个字节的基于输出字节流的序列号。另外在建立连接或断开连接时序列号加1,这种情况以后再详细说明。
(4)
确认号(ACK):长度4字节,表示接收方希望接受的下一帧TCP帧数据字节流的第1个字节序列号。确认号提供对已经接收数据的确认。如果已经发送的数据没有得到正确的确认,就要重发。所以接收方要对已经接收的数据积极确认,确认号对所有的TCP帧来说都是非常重要的。
(5)
TCP帧头长度:长度是4位,表示在TCP帧中TCP帧头的长度,和IP的报头长度一样,它的数值范围是0X5~0XF,她是表示4的倍数的值。如最小的TCP报头长度是20,可以表示为0x5,最大的TCP报头长度是60,它可以表示为0xF,TCP报头的大小始终是4的倍数。
(6)
保留:长度为6位,设为0即可。
(7)
标志:长度为6位,分别表示URG(紧急指针),ACK(确认序号正确),PSH(接收方尽快把数据发到应用层)、RST(重建连接)、SYN(同步序号),FIN(完成)6个标志。置1有效,这6位可以同时多个置1.
(8)
剩余缓存空间:长度是2字节表示发送端接收缓冲区的剩余空间,单位是字节。缓冲区最大值为65535字节,该字段为时,对方不能发送数据。其实该缓冲区是面向应用层的,如果应用层没有读取上面的数据,该字段就会越来越小,直到为0.应用层协议读取后,该字段的值变大,这样就可以保证不会丢失数据。
(9)
校验和:长度2字节,为TCP。提供位级别的综合检查。它的计算包括TCP伪报头,TCP报头、TCP有效负载,不发送TCP伪报头。计算方法与IP报的校验和计算方法相同,计算前要先把TCP校验和字段清0.
下面是TCP伪报头。
源IP地址和目标IP地址与IP报头的相同。未定义字段填0,该协议字段填6.(表示TCP协议),TCP长度填TCP报的长度。对于报文校验和的奇数和偶数个数的问题,其解决方法和UDP的一样,即在最后增加填充字节0,这只是为了计算校验和,增加的填充字0与TCP伪报头一样不被发送。
(10)
紧急指针:长度为2字节,它在URG标志置1后才有用,平时为0.它是TCP发送紧急数据的一种方式。它指出了TCP有效数据中紧急数据的长度和位置,紧急数据都放在当前TCP有效数据的开始到指针以内的范围,RFC793的解析式在紧急指针指向最后一个紧急数据的位置,而新的RFC1122的解析是在紧急指针指向最后一个紧急数据位置再加1的地方。
(11)
选项和填充:长度以4字节增加,具体长度不定,一般是0.但是某些包如建立连接的同步包,是必须由选项的。下面介绍最大段大小选项。它描述了本TCP连接(指建立连接后所传输的数据)中每个TCP帧最大传输数据的大小,它的型号是0x02,长度0x04,然后两个字节表示最大段的大小,单位是字节。SACK选择性重传描述了从TCP上传输的数据中哪些需要重新传输。它在使用前有两个默认字段,两个无操作TCP选择字段,0x01,0x01然后是它选项型号和选项长度。一般它包含两种形式,SACK许可和SACK选项。SACK许可的选项型号是0x04,选项长度是0x02.SACK选项的选项型号是0x05,选项长度是10、18、26、34等,然后跟需要重发数据的左边界(序列号,4字节)、右边界.左边界加右边界刚好定义一个数据段,每定义一个数据段使用8字节,加上前面的选项型号、选项长度后,长度可能是10(1个数据段)或者18(2个数据段)、26(3个数据段)、34(4个数据段)的等。