Skip to content

TCP/IP协议

作者:Annan
发表于:2022-08-08
更新于:几秒前
字数统计:3.8k 字
阅读时长:12 分钟
阅读量:

TCP/IP协议是什么

从字面上来看,很多人会认为 TCP/IP 是 TCP、IP 这两种协议,实际上TCP/IP 协议族指的是在 IP 协议通信过程中用到的协议的统称。

为什么要有TCP/IP网络模型?

对于同一台设备的进程间通信,有很多种方式,比如管道、消息队列、共享内存、信号等方式,而对于不同设备的进程间通信,就需要网络通信。

一开始计算机厂商各自推出各自的网络体系结构和协议,只能用于自己的产品之间通信,就导致不同厂商之间不兼容,而为了让不同厂商的计算机设备都可以互通,在IETF(Internet Engineering Task Force)的建议下协商出了一系列标准化的网络协议TCP/IP。

TCP/IP网络模型分层

从顶向下可以分为应用层→传输层→网络层→数据链路层(网络接口层)。

应用层

我们日常直接接触到的就是应用层(Application Layer) ,电脑、手机使用的应用都是在应用层实现,但若是不同设备的应用之间需要通信的时候,就需要将数据传给下一层,也就是传输层。

应用层专注于给用户提供应用功能,如HTTP、FTP、Telnet、DNS、SMTP等。

应用层不需要关心数据是如何传输的。就像我们寄快递时也不需要关心快递是如何运输到目的地的。

应用层是工作于操作系统中的用户态,而传输层及以下是工作在内核态。

运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。当我们在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态(比如操作硬件)。

结论:如果不涉及与其他设备通信就不需要内核态,也就是不需要从应用层传到传输层及之后的层。在HTTP协议中,连接就是利用内核建立的。

传输层

传输层(Transport Layer) 是为应用提供网络支持的。

传输层有两个协议,TCPUDP

TCP

TCP全称叫 传输控制协议(Transmission Control Protocol),大部分应用使用的是TCP传输层协议,因为应用的应用层使用的是HTTP协议,而HTTP协议是基于传输层的TCP协议。TCP相对比UDP多了很多特性,如流量控制、超时重传、拥塞控制等。是为了确保数据包可以可靠的从一方传输给另一方。

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

image-20250510172921327

UDP

UDP相对来说比较简单粗暴,只负责发送到对应应用数据包,不保证包是否能送到对方,但是它的实时性更好,传输效率也比TCP要高。而且UDP也可以实现可靠传输,只要把TCP的特性在应用层实现就可以,这样整体的数据传输还是可靠的。

为什么TCP要有连接

连接可以确保通信双方的收发能力,从而可以保证数据的可靠性,由于IP协议是无连接的,而HTTP之所以可以保证数据准确是在TCP有连接的基础上保证的。而UDP是继承IP协议的无连接,因此如果不在应用层上实现连接和数据可靠性则整个协议就无法保证数据可靠性。

上述所说的TCP建立连接不是说服务器和客户端真的有根网线连一块,而是一种虚拟的,这就和三次握手和四次挥手相关了。

应用层和传输层之间的关系

在客户端要和服务端通信时,应用层的数据包会送到传输层。而在接收服务端数据时,传输层会将对应应用的数据包发到对应应用的端口。

假如你在电脑上分别在用QQ和微信聊天,当你的电脑接受到一个数据包的时候,该怎么知道他到底是QQ的消息还是微信的消息呢?这就需要用传输层报文中的TCP/UDP头中的端口号(Destination Port)来确定,传输层用端口号来标记不同的应用程序。

image-20250510172938222

比如80端口通常是web服务器用,22端口是远程登录服务器,而浏览器中每一个Tab页则是独立的进程,随机分配的端口号。

网络层

网络层是负责将数据从一个设备传输到另一个设备,而传输层是负责将设备上的数据传输到设备上的应用。目标地址可以是多个网络通过路由器连接而成的某一个地址。因此这一层主要负责寻址和路由选择。

网络层最常使用的是IP协议(Internet Protocol),IP协议会将从传输层传出的报文作为数据部分,再加上IP报头组装成IP报文。这一层的主要作用是给数据包加上源地址和目标地址,将数据包传送到目标地址

既然网络层的目的是将数据包传送到目标地址,那么IP协议是如何做到的呢?

通过IP协议的两大功能:寻址路由

寻址,匹配到相同的网络号(子网),然后去对应子网下找对应的主机。

路由,在实际场景中,两台设备并不是由一根网线连接起来的,而是通过很多网关、路由器、交换机等许多网络设备连接起来,是一个网状的结构,从一个点到另一个点,就会有很多路径,因此当数据包到达途径节点时,就需要路由算法来决定下一步走哪条路径。

和TCP报文类似,IP报文在大于MSS时也会分片

在数据包到达网络层,会和IP头(源地址、目标地址)组装成IP报文,如果IP报文大小超过MTU(一般为1500字节),就会再次分片,得到一个即将发送到网络的IP报文。

image-20250510173003395

上图的意思就是第一次传输层接受到的应用层数据包内容超过一个MSS(TCP 最大报文段长度),因此在传输层分别添加TCP头分为了两个TCP段进行发送,而到达网络层时又都需要添加IP头。而如果此时整个数据包大小若超过MTU(一般为1500字节)就又需要分为两个带IP的数据包到下一层。

IP地址是什么?

IP 地址是一个网卡在网络世界的通讯地址,相当于我们现实世界的门牌号码。

10.100.122.2 就是一个 IPv4 地址。这个地址被点分隔为四个部分,每个部分 8 个 bit(8位2进制),所以 IP 地址总共是 32 位,也就是说IP地址最多有2的32次方个,42亿多个,但没想到还是不够用了,因此出现了IPv6地址,如fe80::f816:3eff:fec7:7975/64,IPv6有128位,总数2^128次方,目前看来是够用了。

IP分类

IPv4地址还被分为了5类,分别是A,B,C,D,E这五种。

image-20250510173014668

对于常用的A、B、 C 类主要分两部分,前面是网络号,后面是主机号。可以认为网络号是小区名,而主机号是具体的门牌名。比如A小区1栋1单元201和B小区1栋1单元201。

而不同的小区可以容纳的住户也是不同数量的,比如A类小区下根据主机号24位则可以有2^24次方也就是16777214户,依次类推。

image-20250510173027481

但是按照这样分配则会造成不够用或是浪费的情况,比如C类地址只有254,对于网吧可能都不够用,而B类下有6万多,非大型企业压根也用不完,会导致浪费。

无类型域间选路(CIDR)

因此除了上述的IP分类,有了一个折中的方法叫无类型域间选路,简称 CIDR(Classless Inter-Domain Routing)。CIDR的做法是将32位的IP地址一分为二,前面是网络号,后面是主机号

  • 网络号,负责标识该 IP 地址是属于哪个「子网」的;
  • 主机号,负责标识同一「子网」下的不同主机;

比如10.100.122.2/24,斜杠后的24代表的意思就是当前网络地址的32位中,前24位是网络号,后8位是主机号。

如何区分网络号和主机号?需要IP地址配合子网掩码算出网络号主机号。其实上述中10.100.122.2 /24中的24就表示子网掩码是255.255.255.0(3个255代表的实际上就是前24个二进制位都是1,8个2进制1刚好是255),代表相同的意思。

将子网掩码和IP地址进行逻辑与(AND)运算可以得到网络号

image-20250510173043706

将子网掩码255.255.255.0取反后与IP地址进行按位与运算,则可以得到主机号也就是2。

伴随CIDR存在的一个是广播地址,10.100.122.255。如果发送到这个地址,则所有10.100.122网络里面的机器都可以收到。网络号可以想成是一个由一些主机组成的大群,广播地址可以认为是直接往大群里发消息的地址

公有 IP 地址和私有 IP 地址

CIDR中还存在公有IP地址和私有IP地址。

image-20250510173101618

公有IP地址可以认为是小区名,私有IP地址可以认为是门牌号,A小区可以有1栋1单元201,B小区也同样可以有1栋1单元201。

常见的公有IP地址就是那些你在互联网上直接访问到的网站服务器,都有一个公有IP地址以供访问。

一般办公室、家里的IP地址都是私有的地址,这些地址允许组织内部的IT人员自己管理、分配。常见的私有地址是家里Wi-Fi下的IP地址,一般是192.168.0.x,一般/24就够了,对应的就是254个可以分配的IP地址。有时也有/16的CIDR,这两种是最常见的。

可以看出192.168.0是网络号,后面是主机号,整个网络中第一个地址192.168.0.1,往往是你这个私有网络的出口地址,比如连接WIFI,WIFI路由器的地址就是192.168.0.1(通常我们管理路由器比如改密码也是登录这个IP)。

MAC地址

在 IP 地址的上一行是 link/ether fa:16:3e:c7:79:75 brd ff:ff:ff:ff:ff:ff,这个被称为 MAC 地址,是一个网卡的物理地址,用十六进制,6 个 byte 表示。MAC 地址是一个很容易让人“误解”的地址。

因为 MAC 地址号称全局唯一,不会有两个网卡有相同的 MAC 地址,而且网卡自生产出来,就带着这个地址。很多人看到这里就会想,既然这样,整个互联网的通信,全部用 MAC 地址好了,只要知道了对方的 MAC 地址,就可以把信息传过去。这样当然是不行的。 一个网络包要从一个地方传到另一个地方,除了要有确定的地址,还需要有定位功能。 而有门牌号码属性的 IP 地址,才是有远程定位功能的。

例如,你是一个警察,要抓法外狂徒张三,现在只知道他的身份证号,张三同名的人很多,总不能满中国翻人身份证看是不是这个法外狂徒,所以你得根据情报之类的线索先确定他在哪个区域,然后再根据监控啥的抓捕。MAC 地址就像是身份证,是一个唯一的标识。它的唯一性设计是为了组网的时候,不同的网卡放在一个网络里面的时候,可以不用担心冲突。

从硬件角度,保证不同的网卡有不同的标识。MAC 地址是有一定定位功能的,只不过范围非常有限。你可以根据 IP 地址,找到杭州市网商路 599 号 B 楼 6 层,但是依然找不到我,你就可以靠吼了,大声喊身份证 XXXX 的是哪位?我听到了,我就会站起来说,是我啊。但是如果你在上海,到处喊身份证 XXXX 的是哪位,我不在现场,当然不会回答,因为我在杭州不在上海。

所以,MAC 地址的通信范围比较小,局限在一个子网里面。例如,从 192.168.0.2/24 访问 192.168.0.3/24 是可以用 MAC 地址的。一旦跨子网,即从 192.168.0.2/24 到 192.168.1.2/24,MAC 地址就不行了,需要 IP 地址起作用了。

数据链路层

通信传输实际上是通过物理的传输介质实现的,数据链路层的作用是在这些通过传输介质互连的设备之间进行数据处理。

将数据中的0、1转换位电压和脉冲光传输通过物理的传输介质在相互直连的设备之间使用MAC地址进行传输。MAC地址,也可以称为物理地址或硬件地址,目的是为了识别连接到同一个传输介质上的设备。

Contributors

Annan

写代码是热爱,写到世界充满爱