计算机网络基础

一、网络基本概念

1.1 网络

网络是指将各种不同的事务或个体连接起来,使它们可以相互交流和相互影响的系统。在计算机领域中,网络通常指的是计算机网络,即利用通信设备和技术将多台计算机连接在一起,以实现信息和资源的共享。网络可以是局域网(LAN)、广域网(WAN)或互联网等不同范围和规模的连接。通过网络,人们可以远程交流、共享数据、获取资源、进行在线娱乐等各种活动。

网络设备:交换机、路由器、集线器

传输介质:双绞线、同轴电缆、光纤

1.2 互联网

互联网是指全球各种网络相互连接而成的巨大网络系统,通过标准的通信协议相连,实现了全球范围内的信息共享和资源交换。互联网的概念最早起源于20世纪60年代美国的军事研究领域,后来逐渐演变成一种全球性的信息交流和传播平台。通过互联网,人们可以在全球范围内进行实时通信、获取各种信息、进行在线交易和互动等各种活动。

简而言之,多个网络连接起来就构成了互联网。

1.3 ip地址

IP地址(Internet Protocol Address)是互联网上用于标识和定位计算机或其他网络设备的数字标识。ip地址即互联网协议地址。在互联网通信中,每台连接到互联网的设备都会被分配一个唯一IP地址,类似于寻找房子时使用的地址。IP地址由一系列数字组成,通常以点分十进制表示,例如:192.168.1.1。

1.3.1 ip地址的作用

IP地址的作用是在互联网上唯一标识每个连接的设备,使得数据包能够准确地被发送到目标设备。通过IP地址,数据包在网络中的传输路线得以确定,确保信息能够准确地被发送到目标地址。IP地址的概念是互联网通信的基础,无论是浏览网页、发送电子邮件、进行视频通话还是其他网络活动,IP地址都扮演着重要的角色。

1.3.2 ip地址分类

IPv4地址由32位二进制表示,一般用点分十进制表示,如:192.168.1.1,分成 4 个字节,每个字节对应 0 - 255 的十进制数。它已经成为互联网的主要使用方式;

IPv6地址则采用128位二进制表示,用冒号分隔的十六进制表示,它用于解决IPv4地址空间不足的问题。如 2001:0db8:85a3:0000:0000:8a2e:0370:7334 。

1.4 MAC地址

MAC地址(Media Access Control Address)是网络设备(如计算机、路由器、网络打印机等)网卡上的物理地址,用于在局域网中唯一标识网络设备。MAC地址通常是一个由12个十六进制数(0-9,A-F)组成的值,如:00:1A:2B:3C:4D:5E。MAC地址是在网络设备制造时固定烧录在网卡上的,独一无二的。

与IP地址不同,MAC地址是硬件层面的地址,用于在局域网内直接通信。当设备在局域网内进行通信时,会根据目标设备的MAC地址来确定数据包的传输目标。每个网络设备都有一个唯一的MAC地址,这样数据包就能够准确地发送到目标设备。

MAC地址通常用于局域网内部通信,而IP地址则用于在广域网(如互联网)中唯一标识设备。在数据包传输过程中,源设备会使用目标设备的IP地址来寻址,并在局域网内通过目标设备的MAC地址来定位。MAC地址在网络通信中起着重要的作用,帮助数据包在局域网中正确地传输到目标设备。

1.4.1 MAC地址与IP地址的关系

MAC地址(Media Access Control address)和IP地址(Internet Protocol address)是网络中两个不同的地址概念。它们之间的关系是:

MAC地址是网络设备(如网卡)的唯一标识符,由设备的制造商预先分配。MAC地址是全球唯一的,用于在局域网中唯一标识一个设备。

IP地址是分配给网络设备的逻辑标识符,用于在Internet上唯一标识一台设备或网络。IP地址允许设备在网络上进行通信和交换数据。

在数据包传输过程中,源设备将数据包封装在帧中,帧中包含目的设备的MAC地址。然后,数据包通过局域网中的交换机根据目的MAC地址传递到相应设备。

一旦数据包到达目标设备,目标设备将解析数据包中的IP地址,确定数据包是否是发给自己的。如果是,则目标设备将处理数据包。

因此,MAC地址和IP地址之间的关系是,MAC地址用于在局域网中唯一标识设备以进行数据帧传输,而IP地址用于在Internet上唯一标识设备以进行数据包路由和通信

例如,在一个局域网中,计算机 A 要向计算机 B 发送数据,首先根据计算机 B 的 IP 地址,通过路由器等设备找到计算机 B 所在的局域网,然后在局域网内通过计算机 B 的 MAC 地址将数据帧准确发送到计算机 B。

1.5 网络协议

网络协议就是一组网络规则库的集合

HTTP:超文本传输协议

TCP:传输控制协议,是一种面向连接的,可靠的,基于字节流的传输层通信协议

UDP:用户数据报协议

IP:互联网协议

ARP:地址解析协议,根据IP地址获取MAC地址的协议

RARP:逆地址解析协议

二、网络分层协议

网络分层:OSI七层模型 TCP/IP四层模型

应用层 应用层

表示层 传输层 TCP/UDP协议

会话层 网络层

传输层 数据链路层

网络层

数据链路层

物理层

2.1 TCP/IP网络模型

2.1.1 应用层

我们可以直接接触到的就是应用层,我们的手机或电脑使用的应用软件都是在应用层实现。**负责为用户提供具体的应用功能,通过各种应用协议比如HTTP(超文本传输协议:浏览网页)、FTP(文件传输协议:上传/下载文件)、Telnet(远程终端协议:远程登录命令行)、DNS(域名系统协议:把网址解析成IP地址)、SMTP(简单邮件传输协议:发送邮件)等来实现。**应用层是工作在操作系统中的用户态,传输层及以下则工作在内核态,当两个不同设备的应用需要通信时,应用就把应用数据传给下一层,也就是传输层。

2.1.2 传输层

应用层的数据包会传给传输层,传输层是为应用层提供网络支持的

在传输层会有两个传输协议,分别是TCP和UDP

TCP是传输控制协议,大部分应用使用的正是TCP传输层协议,HTTP应用层协议。TCP相比UDP多了很多特性,比如流量控制、超时重传、拥塞控制等,都是为了保证数据包能够可靠的传输给对方

UDP是用户数据报协议,只负责发送数据包,不保证数据包是否能抵达对方,但它实时性相对更好,传输效率也高。当然,UDP也可以实现可靠传输,把TCP的特性在应用层上实现就可以,不过要实现一个商用可靠UDP传输协议,也不是一个件简单的事

为什么TCP要主动"拆包",但是UDP可以不主动"拆包"?

TCP拆包的核心原因有两个:保证可靠性和流量控制

①为了保证"可靠重传"的效率(滑动窗口机制)

TCP是面向可靠连接的。如果发送一个1MB的大文件,中间丢了一个字节,TCP就需要重传这个1MB吗?这样效率极低

所以TCP会把大块数据拆成多个小小的数据段(通常按MSS,即最大报文段长度,约为1460字节)。这样,如果中间丢了一个小段丢了,TCP只需要重传这一小段,而不是整个大文件。拆的越小,重传的成本越低

②为了不把网络"堵死"(流量控制和拥塞控制)

TCP有"滑动窗口"机制,它像一扇门,门的大小决定了发送方一次能发多少数据。

如果应用层一下子扔给TCP一个巨大的数据包,TCP会把这个大包拆成无数个小段,然后一个一个的挤过去。发送方会根据接收方的反馈(ACK确认包)和网络的拥堵情况,动态调整每次发送多少个小段。拆包是为了让数据能像小河一样平稳输送,而不是像山洪爆发一样冲垮网络
为什么UDP可以"不主动拆包"?

UDP是面向不可靠传输的,它不关心对方有没有收到,也没有流量控制机制。所以它的原则是:"应用层给我多大,我就发多大,我只负责加个端口号扔出去,剩下的交给IP层"

①保持消息边界

UDP是面向报文的。应用层发了一个10000字节的包,UDP拿到后,不会切开,它会直接封装成一个UDP报文(只是加个头部),然后扔给网络层(IP层)

如果这个包大于MTU(1500字节),IP层会强行把它切成多个IP分片发送。但是到了接收端,IP层会先把这些碎片拼起来,再交给UDP。所以,UDP的接收端永远能收到一个完整的、未经拆分的大包(前提是拼装成功,且没丢片,否则直接丢弃整个包)

②牺牲可靠性换取速度

UDP不拆包,就没有"编号"和"确认机制"。接收端收到一堆IP碎片,如果丢了一片,整个UDP包就废了(UDP不知道如何请求重传碎片)。好处是省去了拆包、编号、排序的开销,延迟极低,所以适合视频直播、语音通话(丢一点没事,速度要快)

对比维度 TCP分段(Segmentation) UDP分片(Fragmentation)
发生在哪一层 传输层(TCP协议自己干的) 网络层(IP协议干的,UDP不管)
发起者 发送端的操作系统TCP协议栈 发送端的操作系统IP协议栈
分片大小依据 MSS(最大报文段长度,通常=MTU-40字节,即1460字节) MTU(最大传输单元,通常1500字节)
是否带编号(SEQ) 有! 每个分段都有序列号,方便重传 没有! IP分片没有序列号,只有偏移量
丢包后果 重传丢失的那一个分段 整个大包全丢,无法重传
重组地点 接收端的传输层(TCP),等所有分段到齐后组装成流 接收端的网络层(IP)按照标志符、偏移量、以及MF标志进行组装,组装完成后才交给UDP
对应用层的影响 应用层不知道拆过包,TCP会拼好再给应用 应用层以为UDP直接给了个大包,其实是IP层"偷偷"拼好的

应用需要传输的数据可能会非常大,如果直接传输就不好控制,因此当传输层的数据包大小超过MSS(TCP最大报文长度),就需要将数据包分块,这样即使中途有一个分块丢失或损坏了,只需要重新发送这一个分块,而不用发送整个数据包。在TCP协议中,我们把每个分块称为TCP段

**当设备作为接收方时,传输层则要负责把数据包传给应用,但是一台设备上可能会有很多应用在接收或者传输数据,因此需要用一个编号将应用区分开,这个编号就是端口。**80端口web服务器用的,22端口通常是远程服务器用的

2.1.3 网络层

传输层可能大家刚刚接触的时候,会认为它负责将数据从一个数据传输到另一个设备,事实上它并不负责。实际场景中的网络环节是错综复杂的,中间有各种各样的线路和分叉路口,如果一个设备的数据要传输给另一个设备,就要在各种各样的路径和节点进行选择,而传输层的设计理念是简单、高效、专注,如果传输层还负责这个有的违背设计原则

我们不希望传输层协议处理太多事情,只需要服务好应用即可,让其作为应用间数据传输的媒介,帮助实现应用到应用的通信,而实际的传输功能就交给下一层,也就是网络层,传输层最后交给网络层的是一个已经封装好"端口号(应用身份)"和"序号(控制信息)"的报文段/数据报,同时附带一个明确的"目标IP地址"指令

网络层最常使用的是IP协议,IP协议会将传输层的报文作为数据部分,再加上IP包头组装成IP报文,如果IP报文大小超过MTU就会再次进行分片,得到一个即将发送到网络的IP报文

IP地址分成两种意义:网络号(标识IP地址属于哪个子网)和主机号(负责标识同一子网下不同主机)