计算机网络基本原理
写该文章的目的是为了了解网络结构、熟知ICMP,TCP/IP等协议。主要内容为探究和学习TCP
内容有两部分,第一部分为网络模型介绍,TCP/IP协议讲解。第二部分为与ICMP、TCP/IP有关的实验验证。
简介
该文章内容为网络通识课作业的副产物,水平有限,如有不正确的地方请见谅.
OSI网络模型

物理层
解决两个硬件之间怎么通信的问题,常见的物理媒介有光纤、电缆、中继器等。它主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。
它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。数据链路层
在计算机网络中由于各种干扰的存在,物理链路是不可靠的。该层的主要功能就是:通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。
它的具体工作是接收来自物理层的位流形式的数据,并封装成帧,传送到上一层;同样,也将来自上层的数据帧,拆装为位流形式的数据转发到物理层。这一层的数据叫做帧。网络层
计算机网络中如果有多台计算机,怎么找到要发的那台?如果中间有多个节点,怎么选择路径?这就是路由要做的事。
该层的主要任务就是:通过路由选择算法,为报文(该层的数据单位,由上一层数据打包而来)通过通信子网选择最适当的路径。这一层定义的是IP地址,通过IP地址寻址,所以产生了IP协议。传输层
当发送大量数据时,很可能会出现丢包的情况,另一台电脑要告诉是否完整接收到全部的包。如果缺了,就告诉丢了哪些包,然后再发一次,直至全部接收为止。
简单来说,传输层的主要功能就是:监控数据传输服务的质量,保证报文的正确传输。会话层
虽然已经可以实现给正确的计算机,发送正确的封装过后的信息了。但我们总不可能每次都要调用传输层协议去打包,然后再调用IP协议去找路由,所以我们要建立一个自动收发包,自动寻址的功能。于是会话层出现了:它的作用就是建立和管理应用程序之间的通信。表示层
表示层负责数据格式的转换,将应用处理的信息转换为适合网络传输的格式,或者将来自下一层的数据转换为上层能处理的格式。应用层
应用层是计算机用户,以及各种应用程序和网络之间的接口,其功能是直接向用户提供服务,完成用户希望在网络上完成的各种工作。
ICMP协议
ICMP协议的功能
ICMP协议的功能主要有:
- 确认IP包是否成功到达目标地址
- 通知在发送过程中IP包被丢弃的原因
ICMP报文格式
CMP报文包含在IP数据报中,IP报头在ICMP报文的最前面。一个ICMP报文包括IP报头(至
少20字节)、ICMP报头(至少八字节)和ICMP报文(属于ICMP报文的数据部分)。当IP报
头中的协议字段值为1时,就说明这是一个ICMP报文。ICMP报头如下图所示。

类型:一个8位类型字段,表示 ICMP 数据包类型。
代码:一个8位代码域,表示指定类型中的一个功能,如果一个类型中只有一种功能,代码域置为
0。检验和:数据包中 ICMP 部分上的一个16位检验和。
ICMP数据部分:包含了所有接受到的数据报的IP报头,还包含IP数据报中前8个字节的数据。
TCP/IP协议
TCP/IP详解
TCP (Transmission Control Protocol)和UDP(User Datagram
Protocol)协议属于传输层协议。其中TCP提供IP环境下的数据可靠传输,它
提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复
用。通过面向连接、端到端和可靠的数据包发送。通俗说,它是事先为所
发送的数据开辟出连接好的通道,然后再进行数据发送;而UDP则不为IP提供可靠性、
流控或差错恢复功能。一般来说,TCP对应的是可靠性要求
高的应用,而UDP对应的则是可靠性要求低、传输经济的应用。
TCP支持的应用协议主要有:Telnet、FTP、SMTP等;
UDP支持的应用层协议主要
有:NFS(网络文件系统)、SNMP(简单网络管理协议)、DNS(主域名称系统)、TFTP(通用文件传输协议)等。
TCP/IP协议与低层的数据链路 层和物理层无关,这也是TCP/IP的重要特点。\
TCP报文

TCP 首部各字段的意义和作用
TCP首部最小为20字节,这20字节分为5行,每行4个字节也就是32个位。源端口和目的端口 Port
源端口号:16位的源端口中包含初始化通信的端口。源端口和源IP地址的作用是标识报文的返回地址。
目的端口号:16位的目的端口域定义传输的目的。这个端口指明报文接收计算机上的应用程序地址接口。
计算机通过端口号识别访问哪个服务,比如http服务或ftp服务,发送方端口号是进行随机端口,目标端
口号决定了接收方哪个程序来接收
分别占用16位,也就是端口号最大是65536,所以端口号的范围是0到65536。序号 Sequence Number
TCP用序列号对数据包进行标记,以便在到达目的地后重新重装,假设当前的序列号为
s,发送数据长度为 l, 则下次发送数据时的序列号为 s +
l。在建立连接时通常由计算机生成一个随机数作为序列号的初始值。确认号 Acknowledgemt Number
占 4 个字节,表示期望收到对方下一个报文段的序号值。 TCP
的可靠性,是建立在「每一个数据报文都需要确认收到」的基础之上的。
就是说,通讯的任何一方在收到对方的一个报文之后,都要发送一个相对应的「确认报文」,来表达确认收到。
那么,确认报文,就会包含 确认号。 例如,通讯的一方收到了第一个 25kb
的报文,该报文的 序号值=0,那么就需要回复一个确认报文,其中的确认号
= 25600。数据偏移 Offset
占 0.5 个字节 (4 位)。 这个字段实际上是指出了 TCP 报文段的首部长度
,它指出了 TCP报文段的数据起始处 距离 TCP报文的起始处 有多远。(注意
数据起始处 和 报文起始处 的意思) 一个数据偏移量 = 4 byte,由于 4
位二进制数能表示的最大十进制数字是 15,因此数据偏移的最大值是 60
byte,这也侧面限制了 TCP 首部的最大长度。标志位 TCP Flags
标志位,一共有 6 个,分别占 1 位,共 6 位 。 每一位的值只有 0 和
1,分别表达不同意思。ACK:确认序号有效
RST:重置连接
SYN:发起了一个新连接
FIN:释放一个连接
校验和 TCP Checksum
占 2 个字节。 由发送端填充,接收端对 TCP 报文段执行 CRC 算法,以检验
TCP 报文段在传输过程中是否损坏,如果损坏这丢弃。
检验范围包括首部和数据两部分,这也是 TCP 可靠传输的一个重要保障。
抓包实验
实验环境及准备
实验平台:windows 11H vrsion:10.0.22621 Build 22621
网卡:Intel(R) Ethernet Connection (16) I219-LM
Wireshark version:4.0.5.0
ICMP抓包分析实验
实验目的
探究ICMP报文在实际数据传输中的存在形式
抓包操作
第一步:确定目标地址,选择www.baidu.com为目标地址。
第二步:启动Wireshark,选择网卡,配置挂虑器为ICMP。
第三步:开始抓包,并在命令提示符下输入ping www.baidu.com

第四步:停止抓包,截获数据。

可看到windows下ping默认执行四次,因此,Wireshark中抓到8个ICMP
报文查询。
数据分析
因windows下ping默认执行8次,我们只分析其中的一次。
报文由IP首部和ICMP报文组成
蓝色为IP首部,共20字节。
蓝色部分为ICMP报文,共40字节
ICMP报头为前8个字节
Type和Code查询
通过查询ICMP报文类型可知,Type为8的包为回射请求(Ping请求)
使用相同的方法,查看Echo (ping) reply包,得到type类型为0
通过查询ICMP报文类型可知,Type为0的包为回射应答(Ping应答)
小结
由实验验证了:ICMP 报文包含在 IP 数据报中,IP 报头在 ICMP
报文的最前面。一个 ICMP 报文包括 IP 报头(至 少 20 字节)、ICMP
报头(至少八字节)和 ICMP 报文(属于 ICMP 报文的数据部分)。\
TCP/IP抓包分析实验
实验目的
探究TCP/IP协议连接过程及原理,深入理解协议封装,协议控制过程及数据承载过程
注意事项
经实际抓包发现,各个网站的主页服务器不会主动断开连接且不严格安装TCP/IP的四处挥手断开,因此只讨论三次握手
抓包操作
第一步:确定目标地址,选择www.baidu.com为目标地址。
第二步:通过ping命令确定域名解析出的ip地址。

第三步:启动Wireshark,选择网卡,配置挂虑器为 ip.addr == 目标ip

第四步:启动抓包,并在浏览器中访问www.baidu.com
第五步:停止抓包,截获数据

数据分析
为建立可靠联系,浏览器会同时建立两TCP连接,我们之分析其中的一个
第一次握手:客户端4133端口向服务器443端口发送连接请求包,
标志位SYN置为1,Seq(初始序列号)为一个随机数3399769215,为方便理解,我们将
用这个随机数记为client_isn, 此时Seq = client_sin
第二次握手:服务器收到客户端发过来报文,由SYN=1知道客户端要求
建立联机。向客户端发送一个SYN=1和ACK(确认应答号)=cilent_ins+1的TCP
报文,设置初始序号Seq为一个随机数3336902631,为方便理解我们将其记
为server_ins,此时Seq=srever_ins
客户端收到服务器发来的包后检查确认序号(ACK)是否正确,
即第一次发送的序号加1(cilent+1)。以及标志位ACK是否为1。若正确,
客户端再次发送确认包,ACK标志位为1,SYN标志位为0。确认应答号
ACK=server_ins+1,发送序号Seq=cilent_ins+1。服务器收到后确认应答号ACK=server_ins+1则
连接建立成功,可以传送数据了。
小结
TCP 三次握手过程
TCP 是面向连接的协议,所以使用 TCP 前必须
先建立连接,而建立连接是通过三次握手来进行的。三次握手的过程如下图:

一开始,客户端和服务端都处于 CLOSE
状态。先是服务端主动监听某个端口,处于 LISTEN 状态
客户端会随机初始化序号(client_isn),将此序号置于 TCP
首部的「序号」字段中,同时把 SYN 标志位置为 1,表示 SYN
报文。接着把第一个 SYN 报文发送给服务端,表示向服务端发起
连接,该报文不包含应用层数据,之后客户端处于 SYN-SENT 状态。
服务端收到客户端的 SYN
报文后,首先服务端也随机初始化自己的序号(server_isn),将
此序号填入 TCP 首部的「序号」字段中,其次把 TCP
首部的「确认应答号」字段填入 client_isn + 1, 接着把 SYN 和 ACK
标志位置为 1。最后把该报文发给客户端,该报文也不包含应用层数据,
之后服务端处于 SYN-RCVD 状态。
客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文
TCP 首部 ACK 标志 位置为 1 ,其次「确认应答号」字段填入 server_isn +
1 ,最后把报文发送给服务端,这次报文可
以携带客户到服务端的数据,之后客户端处于 ESTABLISHED 状态。
服务端收到客户端的应答报文后,也进入 ESTABLISHED 状态。
从上面的过程可以发现第三次握手是可以携带数据的,前两次握手是不可以携带数据的。
一旦完成三次握手,双方都处于 ESTABLISHED
状态,此时连接就已建立完成,客户端和服务端就可以相互发送数据了。
尾言
部分内容引用自小林coding