一、IP 协议的定位
IP:IP 协议提供了一种能力,可以把数据从主机 A 跨网络的送到主机 B 的能力;
TCP:提供可靠性;
TCP / IP :提供可靠的把数据从主机 A 跨网络的送到主机 B 的能力;
二、IP 协议的报头

4位版本号(version):指定IP协议的版本,对于IPv4来说,就是4.
4位头部长度(header length):IP头部的长度是多少个32bit,也就是length 4的字节数.4bit表示最大的数字是15,因此IP头部最大长度是60字节.
8位服务类型(Type OfService):3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为O).4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本.这四者相互冲突,只能选择一个.对于ssh/telnet这样的应用程序,最小延时比较重要;对于ftp这样的程序,最大吞吐量比较重要.
16位总长度(total length): IP数据报整体占多少个字节.1
6位标识(id):唯一的标识主机发送的报文.如果IP报文在数据链路层被分片了,那么每一个片里面的这个id都是相同的.
3位标志字段:第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到).第二位置为1表示禁止分片,这时候如果报文长度超过MTU,IP模块就会丢弃报文.第三位表示"更多分片",如果分片了的话,最后一个分片置为0,其他是1.类似于一个结束标记.
13位分片偏移(framegament offset):是分片相对于原始IP报文开始处的偏移.其实就是在表示当前分片在原报文中处在哪个位置.实际偏移的字节数是这个值8得到的.因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了).
8位生存时间(Time To Live,TTL):数据报到达目的地的最大报文跳数.一般是64.每次经过一个路由,TTL-=1,一直减到0还没到达,那么就丢弃了.这个字段主要是用来防止出现路由循环。
8位协议:表示上层协议的类型16位头部校验和:使用CRC进行校验,来鉴别头部是否损坏.32位源地址和32位目标地址:表示发送端和接收端.选项字段(不定长,最多40字节):略
问题:IP 报文是如何分离报头和有效载荷的?
答:首部长度 + 总长度
问题:IP 协议如何把报文交给上层?
答:通过 8 位协议表示上层协议的类型;
三、网段划分
为什么要网段划分?
答:提升在全网中定位主机的效率,根据:IP 每次淘汰一个子网的所有主机,其实跟根据学号找学生一样;
是谁划分的?
答:运营商;
IP地址分为两个部分,网络号和主机号;
网络号:保证相互连接的两个网段具有不同的标识;
主机号:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号;

我们在没有联网的时候,是没有 IP 地址的,所以:我们的 IP 是由路由器分配的;
不同的子网其实就是把网络号相同的主机放到一起,如果在子网中新增一台主机,则这台主机的网络号和这个子网的网络号一致,但是主机号必须不能和子网中的其他主机重复.
通过合理设置主机号和网络号,就可以保证在相互连接的网络中,每台主机的IP地址都不相同.
那么问题来了,手动管理子网内的IP,是一个相当麻烦的事情,所以解决方案为:有一种技术叫做DHCP,能够自动的给子网内新增主机节点分配IP地址,避免了手动管理IP的不便.一般的路由器都带有DHCP功能.因此路由器也可以看做一个DHCP服务器.
目标 IP 能够找到目标主机,是由网络拓扑结构决定的,是子网划分和路由配置决定的;
四、分片和组装

我们学习网络的本质:我们是在学习一个报文的整个生命周期!
因为链路层收到的 IP 报文(有效载荷)大小不能超过 MTU (1500字节),一旦超过,网络层就要进行分片和组装(例如:客户端的网络层进行分片,服务端的网络层进行组装);
结论:分片和传输的过程,传输层不需要知道;
16 位标识是用来标识一个报文的唯一性的,如果分片了,分片报文的标识是相同的;分片不是简单的对 IP 报文进行分片,而是要对每一片添加 IP 报头:一个报文 -> 多个 IP 报文;
13位分片偏移(framegament offset):是分片相对于原始IP报文开始处的偏移.其实就是在表示当前分片在原报文中处在哪个位置.实际偏移的字节数是这个值8得到的.因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了).
3位标志字段:第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到).第二位置为1表示禁止分片,这时候如果报文长度超过MTU,IP模块就会丢弃报文.第三位表示"更多分片",如果分片了的话,最后一个分片置为0,其他是1.类似于一个结束标记.
如何组装:
1、如何区分分片报文和不分片报文?
答:如果更多的标志位为 1,并且最后一片的标志位为0,片偏移大于0;那么就是分片报文;
2、怎么保证挑出来的分片报文是完整的,怎么组装?
答:有第一片:偏移量为0,最后一片:更多标志位为:0,中间片:按照片偏移数字进行升序排序(当前报文的偏移量 = 上一个报文的偏移量 + 他报文的有效载荷的长度);
细节:任意分片会导致整个报文进行重传(TCP 要求重传,而 UDP 真的丢包了);变相的增加丢包的概率;所以 IP 通信过程中,分片就不能成为主流,因为分不分片由传输层说了算,所以这就是为什么 TCP 不把滑动窗口的数据一次性打成一个包发给对方的原因;所以滑动窗口发送的数据不能超过 1460 ;1460 是 MSS 的值;MSS :最大段尺寸;
