TCP协议在网络通信中扮演的角色主要是为ip协议提供运输数据的策略。而ip则是数据运输的行动部分,ip地址的作用是定位主机,具有一个将数据从A主机跨网络可靠的送到B主机的能力,并不是可以一定送到B主机,而是非常大的概率送到B主机。就跟三次握手一样,并不是一定保证连接建立成功。
在路径选择中,目标ip非常重要,决定了该如何走,ip=目标网络+目标主机。
IP协议
主机:配有ip地址,但是不进行路由控制;
路由器:因为可以跨网段进行传输数据,注定了具有两个ip地址,并且可以进行路由控制;
节点:主机和路由器的统称.
协议头格式
版本:指定IP协议的版本,有IPv4和IPv6(目前中国独有)
首部长度:4byte大小,因为标准长度是20个字节,所以这个值主要是[20,60]之间,多出来的长度一般都是选项的长度。主要作用是为了将报头和有效载荷进行分离。
8位服务类型:3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0)。 4位 TOS分别表示: 最小延时, 最大吞吐量,最高可靠性, 最小成本。 这四者相互冲突, 只能选择一个。对于 ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要。
16位总长度:ip数据包整体占多少字节。
16位标识:用于分包的时候的标识,同一条数据的包的标识一样
3位标志:第0位一般为0,第1位表示是否分包,0表示不分包,1表示分包,第三位表示分隔位,其中分包的标识为1,这个分包的结束位为0,表示这一整个包在这儿结束
13位片偏移:是分片相对于原始ip报文开始处的偏移。 其实就是在表示当前分片在原报文中处在哪个位置。 实际偏移的字节数是这个值 * 8 得到的。 因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了)。
8位生存时间:ip报文的跳数,该报文从A主机经过路由到下一个主机的跳数,每经过一个路由器,TTL--,到0的时候,报文被消散,主要是防止一些迷路的报文一直存在在网络之中,影响网络通信。
8位协议:主要是上层协议的内容,是TCP还是UDP的,主要是向上交付的。
16位首部校验和:进行完整性校验。
32位源ip地址:源ip地址。
32位目的ip地址:目的ip地址。
数据:包含TCP/UDP报头的数据。
网段划分
在日常我们见到的ip地址例如:10.81.183.113,192.168.33.24主要分为两个部分,网络号和主机号,网络号:保证相互连接的两个网段具有不同的标识,如10.81.183.xxx;主机号,同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号.113。
ip地址就跟学校的学号类似,不同学院的学院号是不一样的,同一学院里面的序号是不一样的,但是不同学院的学生,他们的序号是可以一样的。
子网划分:不同子网就是网络号相同的主机放在一起,如果子网中新增一台主机,则这台主机的网络号和这个子网的网络号是一致的,但是主机号不能和子网中的其他主机重复。
所以子网划分的目的在于:为了方便定位互联网中的主机(互联网的每一台主机都隶属于某个子网),提高定位效率,查找效率高。
对于ip地址而言,手动管理子网内的IP很复杂,每新增一个就会手动添加一个ip,少一个就会减少一个ip,所以提出了一种能够自动的给子网内新增主机节点分配IP地址,避免了手动管理IP的不便,这种技术叫做DHCP。一般的路由器都具有该功能,所以路由器也可以看作一个DHCP服务器。
为了划分网络号和主机号,把所有的IP地址分为以下五类
A类:0.0.0.0~127.255.255.255
B类:128.0.0.0~191.255.255.255
C类:192.0.0.0~223.255.255.255.255
D类:224.0.0.0~239.255.255.255
E类:240.0.0.0到247.255.255.255
把所有网段标识一样的设备归为一个子网,不同的子网就是把网段号一样的设备归类到一起。但是上述划分网段的方法容易造成大量的ip地址浪费,例如, 申请了一个B类地址, 理论上一个子网内能允许6万5千多个主机. A类地址的子网内的主机数更多. 然而实际网络架设中, 不会存在一个子网内有这么多的情况. 因此大量的IP地址都被浪费掉了。针对这种情况提出了新的解决方案,称为CIDR,引入一个额外的子网掩码来区分网络号和主机号,子网掩码是一个32位的正整数,通常用一串0来结尾,将ip地址和子网掩码进行按位与操作,得到的结果就是网络号,网络号和主机号的划分与这个ip地址是A类,B类还是C类无关。
可见,IP地址与子网掩码做与运算可以得到网络号, 主机号从全0到全1就是子网的地址范围; IP地址和子网掩码还有一种更简洁的表示方法,例如140.252.20.68/24,表示IP地址为140.252.20.68, 子网掩码的高 24位是1,也就是255.255.255.0。路由器一般是网段标识,也是管理子网IP的设备,目标网络和子网掩码其实都是在路由器内进行配置的。
特殊的IP地址:将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网; 将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包; 127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1。
IP地址是一个4个字节32位整数,一共有2^32次放个地址,大概是43亿左右,TCP/IP规定,每个主机都需要有一个IP地址,实际上由于一些特殊IP地址的存在,数量远远不足43亿,另外ip地址并非是按照主机台数来配置的,而是每一个网卡都需要配置一个或多个IP地址,CIDR在一定程度上缓解了IP不够用的问题,有三种方式解决:
1.动态分配IP地址,只给接入网络的设别分配IP地址,因此同一个MAC地址设备,接入互联网之中,得到的IP地址不一定相同。
2.NAT技术
3.IPv6: IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表示一个IP地址; 但是目前IPv6还没有普及。
私有IP地址和公网IP地址
如果一个组织内部组建局域网,ip地址只用于局域网内的通信,而不直接连到Internet上,理论上使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有ip地址。
10.*,前8位是网络号,共16777216个地址
172.16.到172.31.,前12位是网络号,共1048576个地址
192.168.*,前16位是网络号,共65536个地址
包含在这个范围中的, 都成为私有IP, 其余的则称为全局IP(或公网IP);
路由器作用:转发消息,DHCP(自动分配ip,并且回收ip)以及组建局域网(配置无线网络,设置网络名称和密码),NAT。路由器的转发功能,注定了路由器需要横跨两个子网/局域网。所以路由器有两个口:LAN口:路由器自己构建的子网,WAN口:对外,其他局域网中的一环。如下图所示
对于通信而言,知道了目标地址和源目标地址,让数据在局域网中进行传输,但是在不同的局域网中,ip是可以重复的(这个技术就叫做NAT),并且私网IP不允许出现在公网上,所以每次经过该局域网的管理路由器时,需要将源ip进行替换,替换成路由器的wan口ip 。
查看本机的路由:route
查找下一条的流程:
1.遍历路由表;
2.目的IP & 路由表中的子网掩码(Genmask),确定该报文要去的目标网络,这里的子网掩码越长,去的目的越明确,并且我们要去的目标网络号会一直变化。
3.对比结果 和 Destination,如果这里对比不成功的话,直接去default(默认路由);
4.通过Iface接口发出报文。
分片与组装
这里着重谈一下ip报头的以下三位参数
首先需要明确的一点是在路由器之间相互转发的是ip报文,而在数据链路层中,主要传递的是MAC帧,MAC帧协议规定,单个报文(IP报头+IP报文的有效载荷)不能超过1500字节(MTU,可以修改的),IP不能够决定单个报文的大小,是由TCP决定的,所以此时对于传输层传输过来大于1500字节的数据,需要进行分包。这里的分包主要是靠自己的IP层完成分包,对端的IP层完成组装的。TCP和MAC并不关心IP是否对数据分了包,做好自己的本职工作即可。
如何分片和组装主要是依靠上面三位参数:
16位标识:用于分包的时候的标识,同一条数据包的标识一样
3位标志:第0位一般为0,第一位表示是否分片,0表示不分片,1表示分片,第三位表示分隔位,其中分片的标识为1,这个分片的结束位为0,表示这一整个包在这儿结束
13位片偏移:是分片相对于原始IP报文开始处的偏移。 其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值 * 8 得到的。 因此, 除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了)。
如何知道一个报文被分片了:如果更多分片标志位是1,就证明该报文被分片了。
同一个报文的分片被识别:如果更多分片是0 && 片偏移>0就说明是分片,否则不是。
第一个片:是更多分片标志位为1,片偏移为0;最后一片是更多分片标志位为0,片偏移>0。当前位置+自身长度=下一个报文中填充的偏移量的大小。对于对端IP协议对片偏移进行升序排序就可以得到正确的顺序。在组装完成之后,通过校验和来保证合起来的报文时正确的。
每一个ip报文分片都必须由ip报头,合并的时候把多余的ip报头去掉即可。
分片对于报文的传输来说,并不是好事,一个保温被拆成了多个,任意一个报文分片丢失,就会造成拼接组装失败,进而导致端对端的对整个报文的重传。
总结:ip提供了将数据从A主机到B主机跨网络运输的能力,ip有路径划分,有子网选择能力,所以ip可以规定数据从哪个路由器到另外一个路由器。所以跨网传输的本质是由无数个局域网(子网)转发的结果。