TCP-IP-Protocol
图解计算机网络(TCP/IP网络模型)
网络分层
- 尽力尽力尽力尽力力**传输到对应目标的对应层
- 抽象抽象**的功能
- 每层负责不同的功能,网络通信中主要问题是
- 差错控制:确保发送者-接收者得到相同的信息
- 流量控制:中间节点或者端节点处理能力使得系统陷入bottleneck,导致拥塞
- 分段/分段重组:大数据包需要拆分成不同段,每一段送到接收者顺序不一定确定
- 复用连接,多个上层通信应用通过一个信道传输数据(信道抢占)
- 建立/释放连接
- 网络分层
- 应用层
- 运输层(TCP/UDP)
- 网络层(IP)
- 数据链路层
- 物理层
- 每层依赖下一层提供的接口实现本层的功能
应用层
需要解决的问题
- 定义应用层数据传输的格式HTML,FTP
- 和另一个和另一个*主机上的进程主机上的进程程**如何通信的问题
传输层(内核)
- TCP采取机制保证数据包可靠传输给对方
- UDP只负责发送
- MSS:TCP最大报文段,TCP receiver需要将乱序报文段重组为完整应用层数据
- 到**进程**的数据传输
网络层(内核,路由器)
- 端到端到端**的传输,按照最大传输长度MTU限制划分IP报文
- 如何区分不同端设备?$IP$地址=网络号+主机号,子网掩码标记了网络号长度
- 路径路径路径径**,路由器根据网络号转发数据包
链路层
- IP报文基础上添加MAC Head,封装成Data Frame
- MAC Head包含sender和receiver的MAC地址,通过ARP获得MAC地址
How Linux receive a Network package
同样采取分层结构,每层功能为
- 应用层:提供应用程序(线程)
- 传输层:提供端到端的通讯
- 网络层:每个网络包封装、分片、路由转发
- 网络接口:网络包在物理网络中传播(差错检测,MAC寻址)
Receive a package From OS perspective
触发中断:设备触发中断告知操作系统
避免中断导致的开销:NAPI机制(中断+轮询),外设将数据包写入内存,随后触发硬件中断,调用中断处理程序
网络接口层检查报文合法性,去掉head后调用对应的网络层协议处理函数
网络层负责判断数据包应该交给上层协议(端设备)还是转发(路由器)
传输层分析head,得到数据包的
- 源地址
- 源端口号
- 目的地址
- 目的端口号
并找到目的端口号对应的socket线程,拷贝数据到socket缓冲区,发送给等待数据线程一个信号(将其从sleep队列中唤醒)
应用层将数据从socket缓冲区拷贝到应用层缓冲区
Send a package From OS perspective几乎和上面相反,创建socket同时内核会分配一块空间,拷贝待发送的数据到内核空间,交给传输层
使用UDP和TCP区别在于,TCP中存在重传机制,导致需要实现保存内核区域的一个副本(因为其之后可能被释放),UDP则不用
From Memory Copy Perspective1
- 用户内存拷贝到内核内存
- TCP保存内核副本
- IP层发现数据需要分割成多个packet,将会再次拷贝为多个小的packet