一、主机发送数据包时封装的过程
- 封装了TCP首部:TCP段(TCP segment)
- 继续封装了IP首部:IP数据报(IP datagram)
- 在网络接口层封装了以太网首部和以太网尾部:帧
- IP数据报:由IP首部、TCP首部和DATA部分组成。在IP首部中有一个字段是用来存储IP数据报总长度的字段,在这个字段中存储的数据是IP数据报的大小而不是整个数据包的大小。IP数据报要成为完整的数据包还需要继续封装以太网首部和尾部,完整的数据包也称为以太网帧。
二、linux系统本机数据路由决策
2.1 本机进程间进行数据传输的方式
- 共享内存
- 命名管道
- 套接字
OSI通信模型就是一种基于套接字的网络数据传输机制,既可以用于不同主机间的进程通信,也可以用于本机的客户端和服务端进程的通信。
网络数据传输是一进一出的过程,若在本机的不同进程之间的通信,需要从一个套接字出来,从另一个套接字进去,在本机进行通信数据是不需要经过路由和物理网卡的,而是通过本机的回环口(lookback口)去寻找对应进程的套接字。
- 消息队列
- 信号量
2.2 数据在linux主机上进行传输的过程
- 主机接受到外界发送来的数据。
- 进行路由决策(在内核空间),根据数据的目的地来决定是本机接受还是转发给其他主机。
- 流入本机
2.1 数据从内核空间进入用户空间,所谓进入用户空间也就是被进程接受和处理。
2.2 应用程序生成新的数据包(用户空间响应)。
2.3 数据包进入内核空间,进行路由决策,根据目标决定使用哪个网卡转发。
- 转发给其他主机:
2.1 开启ip_forward功能。(内核空间的功能,开启之后才能进行数据转发,否则接收到的这个数据包会被丢弃掉)
2.2 通过ip_forward判断应该由哪个网卡转发出去(没有对应路由则丢弃),将数据包从流入网卡传递到流出网卡。
- 进出都会进行路由决策
2.3 示意图
- ip_forward转发不会上传到用户空间
2.4 ip_forward的开启方法
- 将该文件内值改成1
[root@tysonscloud ~]# cat /proc/sys/net/ipv4/ip_forward
0