趁着linux内核看得差不多了,想着把网络部分拿来看看,从1.0版本后就开始支持网络了,但看了下发现很多概念不清晰,决定找出tcp-ip学习学习,为内核网络部分做做准备。这些仅仅是个人理解,有误请谅解
1.0数据链路层
协议服务对象
链路层的上层是ip层,ip层有三个协议(IP,ARP,RARP),链路层的目的就是为上层协议发送和接收提供支持,链路层支持多个协议,包括
- 以太网链路层协议
- IEEE 802对以太网进行封装后的协议
- SLIP和PPP两个串行接口协议
我个人理解应该是以太网或者 IEEE802是面向路由器到网局部分的,而路由器到我们终端使用的是串行协议
以太网和IEEE802:
SLIP
用END(0xc0)作为开头和结束,如果IP报文中有END则连续传输0xdb和0xdc来取代它防止被当做结束标志,如果IP报文中有0xdb则连续传输0xdb和0xdd来取代它。
个人理解:SLIP很简单,只用END标记报文的开头和结束,没有协议字段导致它只能支持ip协议,不支持ARP和RARP别的协议,导致使用SLIP的终端必须知道对方的IP才可以通讯。
CSLIP
就是SLIP的压缩版,我们知道就算直接应用报文只有1个字节,但打包成IP协议后也包含IP的20字节的头和TCP20字节的头,这样就有40个字节是协议头,而实际传输的内容只要一个字节,为了避免这种情况,CSLIP对SLIP进行压缩
PPP协议
书中是说PPP解决了SLIP所有的缺陷,但也就是通过增加协议控制位实现的,它对比SLIP新增了控制位,协议位,和CRC校验位,这样它就可以多种协议,支持LCP(链路控制协议)和NCP(网络控制协议),这样就可以在双方之间确定更多的上下文细节。
环回接口
个人理解就是链路层传输过程中一旦检测到IP地址是A类地址,就知道是局域网,就不会发到网络中,而是直接返回到本地网络中。
最大传输单元MTU
也就是不同协议对实际容纳的IP报文大小是有限制的,下图标识了各协议的限制大小
2.0IP协议
IP协议是tcp/ip协议中最核心也是最基础的协议,它是tcp和udp的下层协议,ip协议提供了不可靠,无连接的数据报传送服务。它的不可靠包括不保证数据的到达,比如在某个路由器中,当缓冲区用光之后,新的ip报文会被丢弃掉,然后路由器会向信源发送一个ICMP消息。IP报文的头部有20个字节,如下图
大端法
tcp/ip协议明确了再网络中是以大端传送,即先发送07bit,然后815这样。
版本号
比如4就是ipv4,6就是ipv6
首部长度
普通ip数据报是5,代表头部有5个32bit
服务类型
包括3bit的优先权,4bit的TOS子字段和1bit未用但必须是0
4bit的TOS分别代表:最小时延,最大吞吐量,最高可靠性和最小费用,使用的是位图,并且只能设置一位,如果4bit都是0则代表一般服务,下面是一般程序的推荐值,如FTP控制报文需要最小时延,数据则需要最大吞吐量
总长度字段
是ip头部必要的内容,这样ip层才知道收到的ip长度,因为下层协议如以太网会填充一些数据达到最小长度
标识字段
唯一标识主机发送的每一份数据报,这里可以把它理解成ID号,一般每发送一个报文就会加1
3位标志和13位片偏移
后面补充
TTL
代表报文最多可以经过多少路由器,初始值一般是32或64,每经过一个路由器就-1,当值为0时路由器就丢弃该报文
8位协议
IP层上层有TCP,UDP,ICMP,IGMP等协议,该字段标识协议类型
16位首部校验和
该校验只对IP报文的首部生成校验码,并不包含数据,上层协议中的校验码会去包含数据。计算方式是对首部每16bit进行二进制反码求和,这样接收方就能校验数据是否在传输过程中是否有差错。ICMP,IGMP,UDP,TCP也都采用相同的校验和算法,还有就是路由器才传送IP报文的时候会修改TTL,但路由器只是对TTL做减一,所以路由器也仅仅需要让校验和做加法,而不需要重新计算整个校验和
最后一个选项
如果需要额外补充ip头,首先需要增加4位首部长度的值,并且要求是32bit的整数倍,所以选项中数据不够需要填充0。
路由
如果IP层被设置成了路由器的功能,就要对收到的数据报进行转发,路由器中维护了一组路由表,每个表项包含下面这些信息
- 目的IP地址,可以是完整主机地址也可以是网络地址
- 下一跳的路由器的ip地址
- 标志,其中标识目的地址IP地址是网络地址还是主机地址,另外一个标志指明下一跳路由器是真的路由器还是一个直接相连的接口
- 指定的网络接口
IP路由选择主要是搜索路由表,如果能找到目的IP地址完全匹配的表目,则发往该表目的下一跳路由器,如果没找到则寻找与目的网络号相匹配的表目。都没有找到则寻找路由表中默认的表目,如果都没有成功,一般就会向发送主机发送一个主机不可达或网络不可达的错误
IP的路由的原则是为一个网络制定一个路由器,而不是为主机制定一个路由器,这样做可以大大减少路由表的条目
网络号
前面说过了,路由器的路由表记录的是网络地址而不是主机地址,那比如一个B类地址,前16bit就是网络号,而当把一个网络号分给某个系统后,该系统的管理员可以自己分配子网,比如下图中,就是用8位作为子网号,那么也就是可以容纳254(因为要减去全0和全1的地址)个子网,每个子网可以容纳254台主机。
ipv4各类地址
子网掩码
主机需要知道子网的划分,子网掩码的作用就是让主机知道哪些是网络号,哪些是主机号,也就是把子网掩码写成二进制,1代表网络号部分呢,0则代表主机号部分。
特殊的IP地址
以太网地址和IP地址映射
ARP请求
简单来说,ARP请求过程就是上层应用都是通过ip来通信的,但到物理层,网卡驱动程序只认识48位的mac地址,这时候主机只有对方的ip地址而没有mac地址,就会在局域网广播一条ARP请求,ARP请求中包含了自己的ip地址和mac地址,这样当这条ip地址的主机收到这条ARP请求的时候,就会用请求中的主机的mac地址回复一条ARP请求。
ICMP
ICMP是在IP层上的协议,一般为TCP,UDP使用
Ping程序
Ping程序就是基于ICMP协议,来测试网络是否可达,但现在随着互联网的安全加强,出现了访问控制清单的路由器和防火墙,也就是说不能Ping通并不代表TCP层不通
简单路由表
netstat -rn可以列出本机的路由表
动态路由RIP
RIP是包含在UDP中的,常用的端口号是520
UDP协议
首部:DNS
报文格式:
TCP
新建立连接的时候,SYN标志置1
接收方返回的确认序号是发送期望的序号+1,并且ACK标志置1
U R G 紧急指针(u rgent pointer)有效(见2 0 . 8节)。
A C K 确认序号有效。
P S H 接收方应该尽快将这个报文段交给应用层。
R S T 重建连接。
S Y N 同步序号用来发起一个连接。这个标志和下一个标志将在第 1 8章介绍。
F I N 发端完成发送任务。
连接三次握手:
- 请求方发送SYN,发送生成ISN
- 接收方收到后回发一个报文,ack打开,确认ISN为收到的ISN+1,并且该包还包含一个SYN请求,同样包含接收方的ISN
- 请求方接收到接收方的报文后,再回复一个ack
简单点说就是打电话,
- A跟B说,我是A,听得到吗
- B听到后,回复我听得到啊,那你听得到我说话吗
- A说我也听得到
之所以3次,是因为B收到后返回的报文既有确认信息也有自己的同步消息
理解了同步3次,结束4次也不难理解了,结束的时候
- A跟B说,我的话说完了,可以挂了
- B说收到,但稍等下,我还有点话没说完
- B终于说完了后,说,我也说完了,挂吧
- A说收到,挂了