一. OSI 七层网络模型 Open System Interconnection
OSI | 功能 | TCP/IP 协议 |
---|---|---|
应用层 (Application Layer) | 面向计算机用户,提供应用程序和网络之间的接口,向用户提供服务,完成用户希望在网上完成的各种工作 | HTTP,HTTPS,FTP,TELNET,SSH,SMTP,POP3 等 |
表示层 (Presentation Layer) | 处理来自应用层的的命令和数据,对各种语法解释,按照规格传给会话层。处理编码,数据可是转换和加密解密 | 没有协议 |
会话层 (Session Layer) | 用户应用程序和网络之间的接口,向两个实体表示层提供连接和连接方法,不同实体之间的表示层连接叫做会话,因此主要功能是维护和协调会话之间的数据通信 | 没有协议 |
传输层 (Transport Layer) | 为会话层和网络层提供传输服务,从会话层获得数据,在必要时进行分割,然后传送给网络层,主要起到建立,维护和取消传输连接功能,负责两节点的可靠传输 | TCP、UDP |
网络层 (Network Layer) | 通过路由算法 (两节点之间可能有多条路径),为报文选择最适当的路径,在网络层数据转换为数据包,通过路径选择等控制,将信息从一个网络设备传送到另一个网络设备 | IP、ICMP、RIP、OSPF、BGP、IGMP 等 |
数据链路层 (Data Link Layer) | 数据链路层的数据传输单元成为帧,就是将网络层转发的数据封装为帧,传输给物理层,以及分析物理层传输过来的数据帧 | SLIP、CSLIP、PPP、ARP、RARP、MTU 等 |
物理层 (Physical Layer) | 为数据链路层提供数据帧和接收数据帧然后管理电脑通信设备和网络媒体之间的互通。包括了针脚、电压、线缆规范、集线器、中继器、网卡、主机适配器等 | ISO2110 等 |
二 .TCP/IP 模型
OSI | TCP/IP | 协议 |
---|---|---|
应用层 / 表示层 / 会话层 | 应用层 | HTTP、FTP、TFTP、SMIP、SNMP、DNS |
传输层 | 传输层 | TCP、UDP |
网络层 | 网络层 | ICMP、IGMP、IP、ARP、RARP |
数据链路层 / 物理层 | 网络接口层 | 由底层网络定义协议 |
三. TCP/IP 分层模型图
链路层网络接口层
网络接口层是 TCP/IP 模型的最底层, 负责接收从上一层交来的数据报并将数据报通过底层的物理网络发送出去, 比较常见的就是设备的驱动程序 ARP(地址解析协议)和 RARP(逆地址解析协议)是某些网络接口 (如以太网和令牌环网) 使用的特殊协议, 用来转换 IP 层和网络接口层使用的地址
网络层
对应 OSI 网络层, 负责数据包装寻址路由和交换错误报文只管传送数据, 不管成功与否
IP 网络协议一种不可靠的服务, 快速将源节点送到目标节点, 被 TCP/UDP 使用, TCP 和 UDP 的每组数据都通过端系统和每个中间路由器中的 IP 层在互联网中进行传输
传输层
位于应用层和网络接口层之间, 为两台主机提供端到端的通信, 在 TCP/IP 协议族中, 有两个互不相同的传输协议: TCP(传输控制协议)和 UDP(用户数据报协议)
TCP 为两台主机提供高可靠性的数据通信, 如图:
TCP 首部最小为 20 字节, 这 20 字节分为 5 行, 每行 4 个字节也就是 32 个位
第一行是源端口号和目标端口号, 分别占用 16 位, 也就是端口号最大是 2^16, 所以端口号的范围是 0~65536
第二行, 第三行分别是 32 位序列号和 32 位确认号, 在建立连接时, 计算机生成一个随机序列号作为初始值, 传递给目标, 当对方接收完毕之后, 接收端会返回一个 32 位确认应答号是序列号加数据长度, 当发送端收到确认应答号后, 用来确认这个位置以前所有数据都被正常接收, 否则将会从新连接发送
第四行主要分为两大部分, 左侧 16 位分别是 4 位首首部长度, 如果没有可选字段, 那这里的值就是 5, 表示 TCP 首都的长度为 20 字节, 也就是说 5 行 x 每行 32bit 一位 8bit, 所以就是 5x4=20 字节然后是 6 位保留用作未来使用, 暂时都为 0.
然后是 6 位控制位, 连接, 传输和断开都受到这六个控制位的指挥
URG (urgent 紧急) 紧急标志位, 表示的是此报文段中有紧急数据, 将紧急数据排在普通数据的前面; 当接受端收到此报文后后必须先处理紧急数据, 而后再处理普通数据 通常用来暂时中断通信
ACK (acknowledgement 确认) 置 1 时表示确认号合法, 为 0 表示数据段不包含确认信息, 确认号被忽略
PSH (push 推送) 置 1 时请求的报文在接收方收到时, 会尽快交付接收应用进程, 而不在等到整个缓存区都填满后再交付给应用进程
RST (reset 重置) 置 1 时重新连接, 表示出现错误, 需要释放连接, 再重新建立连接
SYN (synchronous 同步) 置 1 时连接请求或同意报文, 当 SYN=1 而 ACK=0 时, 表明这是一个连接请求报文段对方若同意建立连接, 则应在响应的报文段中使 SYN=1 和 ACK=1
FIN (FINis 终止) 释放连接, 提出断开连接的一方将 FIN 置为 1 表示断开连接
然后第二部分是 16 位窗口大小
窗口 指对于发送报文段一方而言的接收窗口 窗口值 则是告诉发送方, 从报文段首部的确认号算起, 接收方目前允许对方发送的数据量
第五行分别为 16 位校验和 16 位紧急指针
16 位校验和 发送端计算校验和, 接收端进行检验计算和, 如果两次校验一致表示数据正确, 否则认为数据被破坏, 接收端将丢弃该数据, 主要用来差错控制
16 位紧急指针 当 URG 置为 1 时, 指向后面优先数据, URG 为 0 时, 则无效作为填充, 主要用来加快处理标识为 URG 的紧急数据
可选项 TCP 头部长度最多为 60 字节, 所以可选项最多为 40 字节, 在这里不做太多陈述, 具体可查阅 TCP 头部选项
应用层
应用层是我们经常接触使用的部分, 比如常用的 http 协议 ftp 协议(文件传输协议)snmp(网络管理协议)telnet(远程登录协议)smtp(简单邮件传输协议)dns(域名解析), 主要是面向用户的交互的这里的应用层集成了 osi 分层模型中 的应用表示会话层三层的功能
TCP 三次握手, 四次挥手
TCP 是面向连接的协议, 它在源点和终点之间建立虚拟连接, 而不是物理连接
在数据通信之前, 发送端与接收端要先建立连接, 等数据发送结束后, 双方再断开连接
TCP 连接的每一方都是由一个 IP 地址和一个端口组成
首先建立连接, 客户端连接服务端, 发送 32 位序列号 seq=x, 并且 SYN 置 1, 服务端监听客户端发送的序列号, 然后发送 32 位确认响应 swq=y 和 ack=x+1, 并将 SYNACK 置 1, 然后客户端接收以后, 说明服务端接收成功, 然后再返回 ack=y+1, 表示客户端已经接收成功可以开始连接
当需要断开数据的时候, 客户端发送序列号 seq=x+2, 确认号 ack=y+1, 并 FIN 置 1, 服务端接收以后, 返回 ack=x+3, 并 ACK 置 1, 如果有数据没有传送完毕, 等待传送完毕返回序列号 seq=y+1 也就是返回确认号, 并 FIN 置 1, 如果没有数据则合并 ack=x+3,seq=y+1 FIN 置 1, 最后客户端接收以后返回给服务端确认号 ack=y+2 来确认断开
抓包
Window 用科来网络分析系统, 如图
如图所示三次握手, 第一次客户端发送 seq 序列号, ACK 置 0,SYN 置 1 然后服务端收到序列号后发送列号 seq, 确认号 ack 为客户端序列号 + 1, 且 SYNACK 置 1, 然后客户端接收以后发送序列号为服务端的 ack 确认号, 并发送确认号为服务端序列号 + 1, 且 ACK 置 1
如图所示四次挥手变三次挥手, 因为没有数据需要等待传输, 首先客户端发送序列号为服务端在握手中发送的确认号, 确认号为服务端发送的序列号 + 1, 且 ACKFIN 置 1, 当服务端收到以后开始发送给客户端, 序列号为客户端发送的确认号, 确认号为客户端发送的序列号 + 1, 且 ACKFIN 置 1, 当客户端收到以后再发送给服务端, 序列号为服务端发的确认号, 确认号为服务端发送的序列号 + 1, 且 ACK 置 1, 结束连接
Mac 用 WireShark
WireShark 主要用于抓包, 在这里我们需要用 wireshark 查看 tcp 的三次握手和 4 次挥手, 具体请查看 WireShark 教程
UDP 则为应用层提供一种非常简单的服务, 如图:
UDP 是一个无连接不保证可靠性的传输层协议, 也就是说发送端不关心发送的数据是否到达目标主机数据是否出错等, 收到数据的主机也不会告诉 发送方是否收到了数据, 它的可靠性由上层协议来保障
首部结构简单, 在数据传输时能实现最小的开销, 如果进程想发送很短的报文而对可靠性要求不高可以使用
16 位源端口号和 16 位目标端口号和 TCP 一样
16 位 UDP 长度代表数据长度
16 位 UDP 校验和, 用于差错控制
主要应用于 QQ 视频软件 TFTP 简单文件传输协议(短信)
三. 应用交互举例
四. 参考
TCP/IP 分层模型
TCP/IP 维基
OSI 七层模型详解
来源: https://juejin.im/post/5a7aacf45188257a6a78b561