网络的层次模型

现行的网络是层次模型的。
- 应用层:负责使用特定于两个应用程序之间可读的字节流来进行数据传输。
- 传输层:保证正确、有序的端到端传输数据并控制拥塞。
- 网络层:只使用IP协议,尽可能地提供端到端的数据传输。
- 链路层:通过终端主机和路由器之间的单个链接来传输数据

此外,在现行的网络模型是“瘦腰”的因为如果要是用Internet就必须使用Internet Protocol也即IP协议

除了四层模型外,在1980年国际标准组织还提出了OSI七层模型,不过这个模型基本只存在于标准文书中,现行的网络采取的是四层模型。
IP服务模型

Internet Protocol 具有以下属性:
- 不维护与数据报相关联的每个流状态。
- 当它发送数据时会创建一个数据报并将数据放入其中,数据报将根据它携带的头信息,来各自独立的经由Router来传输。
- IP不可靠,它不保证将数据报传到目的地它可能会延迟交付,不按顺序交付,或者丢失。
- 高效。
- IP是面向无连接的。
之所以将IP协议设计的如此简单,一方面是为了能高效传递信息,另一方面则是为了解耦,方便在顶层构建各种可靠或者不可靠的服务。

1、由于数据报是经由Router来转发到目的地的,所以可能出现环,导致这个数据报一直被转发。所以IP报头设置了TTL(time to live)它被设置成128之类的数字,每经过一个Router会将TTL减去1当TTL归0时该数据报被丢弃。
2、IP会对过大的数据报进行分割,因为IP被设计成可以在任何类型的链路上运行,如果该链路能承载的最大长度,小于要发送的数据报的长度,IP会分割该数据报。
3、使用校验和来减少将数据报传递到错误目的地的可能
4、允许添加新报头

- Protocol ID 标记了数据的内容,它允许目标端主机对到达的数据报解包。如果Protocol ID为6,说明数据中包含一个TCP段这样就可以安全的将数据报发送给负责解析TCP的应用。IANA定义了超过140种协议值来对应不同的传输协议
- Version注明了IP的版本,IPv4或IPv6
- Total Packet Length最大值为64kByte这意味着报头加数据的总长度最大可达64kByte
- TTL time to live
- Flag和Fragment Offset用来帮助Router在必要的时刻来分割数据报
- Type of Service用于告诉Router该数据报的重要性
- Header Length表示报头大小
- OPTIONS来携带额外信息
- Checksum校验和,由整个报头计算得来,用来防止报头损坏后将包传输到错误的地址
TCP三次握手
synchronize,
synchronize and acknowledge,
acknowledge,
or
“SYN, SYN-ACK, ACK”
数据报封装

大端与小端

假设内存的读取顺序是由左至右,小端指的是最高位在右边,然后从右至左,最高位至最低位。大端指的是最高位在左边,也就是正常的阅读顺序
子网掩码

子网掩码用于判断源地址和目标地址是否在同一个网络下。
例如子网掩码为255.255.255.0则用源IP地址和目标IP地址分别和子网掩码做按位与,如果得到的结果相同则它们在同一个网络下。
IP地址的结构

A类地址以0开头,前7位表示网络地址(128),后24位表示主机地址(16,777,216)
B类地址用16位表示主机地址(65535)
C类地址用8位表示主机地址(256)

如今有一种更加结构化的IP地址表示法CIDR(Classless Inter-Domain Routing)
地址后面的斜杠表示的是子网掩码的长度,比如/20表示(32-20)^2
即4096个地址
路由转跳

由上所述,数据报是通过Router转发来传输的,而IP报只携带了目标地址,并没有规定要经由那些路由,为了让数据能传输到目标地址就需要转发表的帮助。
每个Router都维护着一个表,当新数据报发来时会根据最长前缀匹配原则将其转发到对应的链路上,如果最终匹配的长度为0则会转发给默认链路。
ARP(Address Resolution Protocol)
IP地址是一个网络层地址,它描述了一个主机在网络层的位置。而链接地址描述了一个网卡在链路层的地址。ARP的作用就是通过IP来获得MAC地址。

现在假设192.168.0.5要向171.43.22.5发送数据报,要经过网关,那么此时它的IP报头将包含目标地址171.43.22.5,链路层报头要包含网关地址(MAC地址),这样才能先经过网关然后由网关将数据报发送出去,此时为了获得网关地址就要用到ARP协议。

APR协议是一种请求-应答协议,每个节点都保存着IP地址和链路层地址的映射,如果一个节点要向一个在映射表中不存在的IP地址发包,那么这个节点将发送一个广播来询问同一网络下的所有节点来查找该IP地址,如果找到,将会返回IP地址和链路层地址。同时广播的时候发请求的结点也会将自己的映射发出去,这样所有节点就都可以更新映射。

- Hardware 此请求或响应用于哪个链路层
- Protocol 此请求或响应所针对的网络协议
- length 表明网络或链路层地址的长度
- Opcode 表明该包是请求还是响应
所有字段以网络顺序或者大端顺序存储