TCP/IP分层模型与通信示例
数据包首部
- 在每一个分层中, 都会对所发送的数据添加一个首部 - 首部中包含了该层的必要信息 - 比如发送的目标地址以及协议的相关信息 - 从当前层的视角来看, 从上一层接收的的报全部认为是本层的数据, 即称为数据报(datagram)
[!note] 包, 帧, 数据报, 段, 消息 - 包: 全能性述语 - 帧: 表示数据链路层中包的单位 - 数据报: IP和UDP等网络层以上的分层中的包的单位 - 段: TCP数据流中的信息 - 消息: 应用协议中数据的单位
[!note] 包首部就像是协议的脸 通过数据包的首部, 就可以知道当前的协议应该如何读取数据
发送数据包
以下以发邮件的过程为例, 说明TCP/IP通信的过程
应用程序处理
当在应用程序中点击了"发送"按钮, 即开始了TCP/IP的通信 首先, 邮件应用程序会对即将发送的邮件进行编码处理, 这里是OSI的表示层的功能. 邮件转码结束后, 还有根据邮件发送的需求, 对邮件进行处理, 类似于这样的处理和管理功能, 属于OSI模型中的会话层的功能 然后, 将应用的数据发送给下一层的TCP进行处理, 再做实际上的转发处理.
TCP模块的处理
TCP会根据应用的指示, 建立起连接、发送数据以及断开连接, 提供可靠的传输过程. 为了实现TCP的这一功能, 需要在应用层发来的数据的前端添加一个TCP首部. 在这个首部中, 包含的信息有: 1. 源端口号 2. 目标端口号: 用来识别发送主机与接收主机上的应用 3. 序号: 标识发送的包是哪一部分的数据 4. 校验和: 校验数据在发送的过程中, 是否损坏(可能收到攻击或噪声的影响) 在添加完首部后, 继续将数据发送给IP(Internet Protocol)
IP模块的处理
从TCP模块传来的数据, 对于IP模块来说, 就是一个数据报(包括了TCP模块添加的首部) IP模块在收到的数据报上添加自己的首部信息, 包括了: 1. 接收端IP地址 2. 发送端IP地址 3. 数据报是TCP还是UDP信息 生成IP包后, 会依据路由控制表, 决定将此IP包转发到哪一个路由或主机
[!note] 如果还不知道接收端的MAC地址, 则使用ARP(Address Resolution Protocol)进行查找 只要知道了对端的MAC地址, 就可以将MAC地址和IP地址缴费以太网的驱动程序, 实现数据传输的功能
网络接口(以太网驱动)的处理
同样的, 从IP传来的数据, 对以太网驱动来说是他的数据报, 以太网驱动添加的首部信息包含了: 1. 接收端的MAC地址 2. 发送端的MAC地址 3. 标志以太网类型的以太网数据的协议 根据以上的信息, 以太网数据报将通过物理层, 将数据传输给接收端 发送处理中的FCS(Frame Check Sequence)由硬件进行计算, 并且添加到包的最后(设置FCS的目的是为了判断数据包是否由于噪声而被破坏), 这一部分是属于链路层的功能
经过数据链路的包
每个包的首部中至少都会包含两个信息: 1. 发送端和接收端的地址 2. 上一层的协议类型 每个协议分层时, 都必须有识别包发送端和接收端的消息: - 以太网: 使用MAC地址 - IP: IP地址 - TCP/UDP: 端口号 除此之外, 每个分层的包首部还包含一个识别位, 用来表示上一层协议的种类信息
数据包接收处理
包的接收过程就是发送过程的逆序过程
网络接口的处理
在主机收到以太网包以后, 需要首先从以太网包的首部中找到MAC地址, 判断是否为发送给自己的包 1. 不是: 丢弃数据 2. 是: 查找以太网包首部中的类型域从而确定以太网协议所传送过来的数据类型, 并且使用对应的协议进行处理 - 如果包含了一个无法识别的协议类型, 则丢弃数据 在本例中, 交给IP模块进行处理
IP模块的处理
IP模块收到IP包首部及后面的数据部分以后, 也进行类似的处理 如果在首部中的IP地址与自己的IP地址匹配, 则接收数据, 并且从中查找上一层的协议, 并且交给对应的模块进行处理 在本例中, 即交给TCP进行处理
TCP模块的处理
在TCP模块接收到数据时候, 会首先进行一系列检查: 1. 校验和, 判断数据是否被破坏 2. 检查是否在按照序号接收数据 3. 检查端口号, 确定具体的应用程序 数据接收完毕后, 接收端会发送一个"确认"(ack)给发送端, 如果这个回执信息未到达发送端, 则发送端会认为接收端没有收到数据而反复发送, 直到收到了回执 数据被完整的接收后, 会传送给端口号识别的应用程序.
应用程序的处理
接收端应用程序会直接接收发送端发送的数据 在邮件客户端上, 通过解析数据, 可以获知邮件的收件人地址是乙的地址 如果当前的主机不属于乙, 那么主机会返回发送端一个"无此收件地址"的报错信息 确认当前的主机属于乙, 则主机就能收到电子邮件的正文, 并且保存在本机的硬盘上, 并且返回一个处理正常的回执给发送端. 如果在这个过程中出现了异常, 则返回一个"处理异常"的回执.