
01 概述 以太网这个术语一般是指数字设备公司(Digital Equipment Corp.)、英特尔公司(IntelCorp.)和Xerox公司在1982年联合公布的一个标准。它是当今TCP/IP采用的主要的局域网技术。几年后,IEEE(电子电气工程师协会)802委员会公布了一个稍有不同的标准集,其中802.3针对整个CSMA/CD网络,802.4针对令牌总线网络,802.5针对令牌环网络。 % S7 o9 f0 H3 v' i+ N% \ 互联网早期的时候,主机间的互连使用的是NCP协议。这种协议本身有很多缺陷,如:不能互连不同的主机,不能互连不同的操作系统,没有纠错功能。为了改善这种缺点,大牛弄出了TCP/IP协议。现在几乎所有的操作系统都实现了TCP/IP协议栈。TCP/IP不是一个单一协议,而是一个协议族的统称。里面包括了IP协议,IMCP协议,TCP协议,以及我们更加熟悉的HTTP、FHP协议等等。 首先我们看一下以太网数据结构 ![]() + c. h6 j/ E2 B* s% |$ w u6 w ' q7 t5 X; k K% t! k/ P 注意数据长度为46~1500* J2 d4 M$ C0 G& k1 S7 y # \& }) v" Z2 l+ _) y 从物理层上看,一个完整的以太网帧有7个字段,事实上前两个字段(前同步码和SFD码)并不能算是真正的以太网数据帧,它们是网卡在物理层上发送以太网数据时添加上的,是为了实现底层的正确传输。上图中的目的地址,源地址,长度/类型属于以太网首部的部分。 2 w$ Y# s: I6 `0 a+ r9 A 特别说明:上面的目的地址和源地址是MAC,不是IP!!!! 5 n' [# A. R3 w 关于OSI七层模型:应用层、表示层、会话层、传输层、网络层、数据链路层、和物理层,如下图 7 f& V! e+ W% C7 J) X# W y. Y ![]() 02 TCP/IP四层模型 - E/ S# X& d- z ISO制定的OSI参考模型的过于庞大、复杂招致了许多批评。与此对照,由技术人员自己开发的TCP/IP协议栈获得了更为广泛的应用。下图,是TCP/IP参考模型和OSI参考模型的对比示意图 6 V9 q0 B1 @$ [/ R9 f/ v ![]() ! |0 m q" `, S$ K% U/ ^4 F TCP/IP参考模型分为四个层次:应用层、传输层、网络互连层和主机到网络层6 ?/ _5 g( c4 w. g F6 w- z 5 V, P, b. H0 G6 I% g 6 W+ t. I5 I |/ m* D7 i ![]() 在TCP/IP参考模型中,去掉了OSI参考模型中的会话层和表示层(这两层的功能被合并到应用层实现)。同时将OSI参考模型中的数据链路层和物理层合并为主机到网络层。下面,分别介绍各层的主要功能。 N( ~" N/ H9 j 1、主机到网络层 x7 X/ d; ]+ J" K9 V" { 实际上TCP/IP参考模型没有真正描述这一层的实现,只是要求能够提供给其上层-网络互连层一个访问接口,以便在其上传递IP分组。由于这一层次未被定义,所以其具体的实现方法将随着网络类型的不同而不同。 + z9 D- F' b+ K& @* @6 t ' @9 [( N! H$ W. ~+ S6 k 2、网络互联层* ~3 [ Q1 S( ~; R 2 A- [' K. `; U* C4 D( P- w 网络互联层是整个TCP/IP协议栈的核心。它的功能是把分组发往目标网络或主机。同时,为了尽快地发送分组,可能需要沿不同的路径同时进行分组传递。因此,分组到达的顺序和发送的顺序可能不同,这就需要上层必须对分组进行排序。 / y0 h* p2 ^. v' E; M8 X3 Y) e7 U' Z! ~) r ; E5 ]0 v, _, P" j' {; f! f+ l4 L# J 网络互联层定义了分组格式和协议,即IP协议(InternetProtocol)。 r, [& J* H9 }2 [" I7 ` 6 K* y+ N5 j& k8 _ 网络互联层除了需要完成路由的功能外,也可以完成将不同类型的网络(异构网)互连的任务。除此之外,网络互联层还需要完成拥塞控制的功能。 N3 y _. N7 c5 @ 1 g; P4 n- @1 V$ I+ L 3、传输层! ?) ~6 P) J6 M" f; p 在TCP/IP模型中,传输层的功能是使源端主机和目标端主机上的对等实体可以进行会话。在传输层定义了两种服务质量不同的协议。即:传输控制协议TCP(transmissioncontrol protocol)和用户数据报协议UDP(userdatagram protocol)。 k k/ Y7 S. `- O8 `$ {' G6 \9 h$ i h; D! ~2 \/ j ? ) ]( Z% t. `9 p4 y# g3 H TCP协议是一个面向连接的、可靠的协议。它将一台主机发出的字节流无差错地发往互联网上的其他主机。在发送端,它负责把上层传送下来的字节流分成报文段并传递给下层。在接收端,它负责把收到的报文进行重组后递交给上层。TCP协议还要处理端到端的流量控制,以避免缓慢接收的接收方没有足够的缓冲区接收发送方发送的大量数据。8 V# {4 t2 ~4 H p1 | + G. J" T2 i( O, v* \& ] UDP协议是一个不可靠的、无连接协议,主要适用于不需要对报文进行排序和流量控制的场合。 ! |, A: K+ J! h& p3 h0 K 4、应用层! @" `- e8 i/ ]6 I2 ]8 |/ [ ( u J6 q: ]% d/ S TCP/IP模型将OSI参考模型中的会话层和表示层的功能合并到应用层实现。 4 U1 }# O7 L4 V. v2 j & h* e. H% d7 Z( A2 W8 A 应用层面向不同的网络应用引入了不同的应用层协议。其中,有基于TCP协议的,如文件传输协议(FileTransfer Protocol,FTP)、虚拟终端协议(TELNET)、超文本链接协议(HyperText Transfer Protocol,HTTP),也有基于UDP协议的。 ![]() $ z+ z Q6 w) ~5 t' n/ m$ j 各行信息分别为: Frame: 物理层的数据帧概况 8 E3 p# t6 L0 b1 n 1 O+ e, l `+ R Ethernet II: 数据链路层以太网帧头部信息' a, v$ C: W: _ 3 e/ j* X# a+ ?0 Q% Y: w Internet Protocol Version 4: 互联网层IP包头部信息 % V! r5 ^: _& k$ q/ a, _' L3 A2 @ Transmission ControlProtocol: 传输层T的数据段头部信息,此处是TCP Z% z- z+ F7 t# F # ~0 g; D" E8 u! w, d# o 2 O5 u! \7 A* H) r0 B; N Hypertext Transfer Protocol: 应用层的信息, / L, B& l* J$ }: H$ w, Q& D, s1 i ![]() . R# x) E9 {' v; j$ o# b% B 几个常用的协议的功能我们通过一个形象的说法来展现. J/ z6 G( o7 ]$ E' f 9 d' F8 k% t( v# c9 C 6 R- |! ^ F: s4 N6 U1 A8 l( [0 u IP:I want to send data to 192.168.0.127 : b* v4 G- h! X* |' T& K. ~ UDP:I want to send a datagram on the port N; R! F D w4 C$ C8 W8 s0 v 3 T$ e/ E4 `+ S' u( i" F/ w8 F TCP:I want to send data in a reliable way onthe port N (reliable:可靠的)! v* e: b) H' Q2 M! P- ]4 ]1 K & J' K% N: Q c. ]" p/ Q7 Z ARP:who knows 192.168.0.127's MAC address?- g( a1 o, D& k1 q- M2 }4 w RARP:who knows 21.21.12.21.21.12's IP address?, K! C0 [. z; v, b( W8 n- o# k : O1 v1 G. r9 B3 c0 j- Q ICMP:I send or receive queries or error message & H& U$ ` l; |$ ? DHCP:I want to get an IP address% I) T- l4 _! q9 q : }. d7 f( N. a; E7 H- G+ J6 m DNS:what is the IP address of www.baidu.com? / M# L/ }9 x8 q3 ^5 o5 C. t& k2 N |
实战经验 | RT-Thread环境下Flash错误标志问题解析
OpenBLT移植到STM32F405开发板
stm32使用定时器触发dma传输,启动dma没反应的几种情况的解决方法
【STM32H7S78-DK评测】XIP项目源码分析
基于STM32单片机软硬件结合经验分享
【NUCLEO-C0评测】硬件OLED显示
基于STM32代码的启动过程经验分享
基于STM32 GPIO 经验分享
ClassB在STM32CubeIDE上的移植可能遇到的问题
基于STM32看似无法唤醒的一种异常现象经验分享