【网络&通信协议系列(二)】TCP/IP协议栈

最开始要说明的是,日常接触到的”TCP/IP协议”其实指的是TCP/IP协议栈,既然是协议栈 ,也就是一系列协议,今天这一篇就详细的讲讲这个构成现代网络通信的最基础的系列协议。

OSI与TCP/IP网络模型

学过计算机网络的同学对网络模型划分应该不陌生,标准有OSI七层结构以及现在流行的TCP/IP四层模型(也有说五层的,差不多),比较如下(图片来源于网络):
这里写图片描述
OSI模型划分:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
TCP/IP模型划分:应用层、传输层、网络层、链路层(也有说五层的,区分了链路层与物理介质)

每一层都有一系列的协议,在右图可以看到,有我们最熟悉的HTTP、SMTP、TCP/UDP、IP/ARP等,还有很多乱七八糟听都没听过的协议。

两者的关系:OSI是最初的网路模型标准,提供细致的层级划分。TCP/IP四层模型是后来为符合实际情况的使用而基于OSI的抽象,可以理解为两者只是称呼不同,没有本质区别,只是划分粒度稍有不同。

TCP/IP协议栈详解

网络模型的层次划分,提供逐层协议封包、解包的具体约定。接下来对通信过程自底向上的逐步讲解:

物理层

所谓的网络通信,是计算机之间以物理介质相互连通,将数据经过不同协议的编解码,进行信息传输的过程。

因为计算机只能识别0和1,所以计算机之间一定是通过二进制信号进行交互,常见的有电信号与电磁脉冲。无论是何种传输表现形式,一定离不开物理介质,如网线、光纤、无线网络收发器等设备,物理介质提供传输的通道或者信号收发、分发功能。

所以这一层的主要功能是通过物理介质链接与传输二进制信号0和1,核心是物理设备

数据链路层

通信过程必须角色有:收发双方与信号传输介质,物理层完成最基本的信号传输过程与通信双方的链接,并不知道具体的通信双方。

网络通信中使用MAC地址唯一标志设备在网络中的具体位置,MAC地址是网卡决定的,所以实际上MAC地址唯一标志设备的网卡地址。

百度百科:MAC(Media Access Control)媒体访问控制,或称为物理地址、硬件地址,用来定义网络设备的位置。MAC地址是网卡决定,是固定的。

MAC地址使用16进制数表示,共6个字节48位,高24位标志网卡设备生产商,低24位表示具体厂商给设备分配的序列码。

数据链路层专注MAC地址,负责发送方到接收方的MAC寻址然后进行数据报发送。前面说到物理介质通过传输0和1进行通信,而单独的发送0/1是没有意义的,所以要对0和1进行分组且标志好每一组电信号的信息特征,然后以分组的顺序依次发送。

负责分组发送的过程称为以太网协议以太网规定一组电信号就是一个数据包,以帧为单位,一个数据包就是一帧。

一个完整的以太网数据包组成:

首部(14字节)、数据包(46~1500字节)以及尾部(4字节)

首部固定为14字节,包含发送/接收双方的源MAC地址与目标MAC地址;数据包最短46个字节,最长1500字节,所以当数据量过大时会拆分成多个数据包发送;尾部4字节为校验位,用于校验数据报在传输过程中是否被篡改或损坏。

数据传输的过程为:以太网以广播的形式,将数据包发送给子网内的所有设备,接收到数据包的设备会读取首部的目标MAC地址,与自身MAC比较是否符合,如果是则接收处理,否则丢弃。

所以数据链路层主要负责将上层数据转换为二进制数据帧然后通过物理介质以广播的形式发送到目标主机的过程。

网络层

网络层负责IP地址,主要工作为:解析上层数据包并封装为IP数据包,通过IP地址完成MAC寻址进而通过下层协议完成通信,IP数据包组成部分为:

IP首部(20字节),IP数据包(最大65515字节)

首部包含源IP地址与目标IP地址,理论上一个IP数据包最大可达65535字节,而之前的以太网数据包最大只有1500字节,如果一个IP数据包大于以太网数据包,便会进行IP分片,将IP数据包分为多个帧发送。

前面说到链路层通过子网广播的形式发送数据包,这里会有几个问题:

  1. 发送者如何知道目标MAC地址
  2. 发送者如何知道自己与接收者同属一个子网,如果接收者与自身不在同一个子网怎么办?

为了解决这些问题,网络层引入了更高级的协议,主要有:IP协议、ARP协议、路由协议

IP协议

MAC地址唯一且由网络适配器厂商确定,无法区分网络设备群是否同属一个子网,为了解决这个问题,引入了IP地址。目前有IPv4与IPv6(IPv4地址是一个32位地址,最大数量2的32次方,42亿多个且有一部分因为一些原因无法参与分配,而随着社会进步接入互联网的设备越来越多,至今已经成了稀缺资源,于是相关标准制定者主键引入IPv6来解决这个问题,IPv6总共有2的128方个地址),以现阶段常用的IPv4为例,地址被分为两部分,前面部分标志网络地址,后面部分标志主机地址。因为各类IP地址划分的不同,详细参见:百度百科:IPv4

如果两个设备同属一个子网,则对应IP的网络地址一定相同。为了判断IP的网络地址,还引入了子网掩码,IP与子网掩码按位与的结果就是设备的网络地址。

ARP协议

地址解析协议(Address Resolution Protocol),用于通过IP地址获取MAC地址的协议。

工作原理如下:

ARP首先发起一个查询请求数据包,数据包首部包含接收方IP地址,通过数据链路层分组后通过以太网协议经物理介质广播到子网内所有主机,主机接收到数据包后会取出首部的IP地址与本机IP地址比较,如果相同则返回本机的MAC地址。发送方在接收到目标MAC地址后会将其缓存到本地,下次再查询时会先通过本机未过期缓存来返回结果。

可以通过arp -a查询操作系统ARP缓存。另外ARP协议建立在网络信任的基础上,可能导致不安全,具体参见:百度百科:ARP

路由协议

ARP协议解决的是同一个子网内的通过IP地址获取到MAC地址,而不同子网之间的通信是通过路由协议完成的。

当通过IP协议发现接收方目标IP不在当前子网内,则会通过本子网的网关进行路由,路由可能会有多次,直到找到目标IP对应的子网,然后再是ARP的过程。完成路由协议的设备称为路由器,路由器是网络通信世界的交通枢纽,它会根据信道情况,选择并设定路由,以最佳的路径转发数据包。

传输层

传输层负责端到端的通信,前面说到网络层通过IP地址完成主机网络地址的确认,能够确定通信双方主机的唯一性。网络通信通常发生在基于操作系统的进程之间,同一个机器的进程通过唯一端口号唯一确定。

传输层协议有UDP、TCP两种,UDP定义的数据包称为UDP数据包,组成部分为:

首部(8字节)、数据包(65527字节)

首部包含源端口与目标端口,整个数据包最大长度为65535字节。通常说UDP协议是不可靠的,原因在于其没有确定与重试机制,发送方不考虑接收方是否成功接收成功。为了解决这个问题,于是引入了TCP协议。

TCP是面向连接、可靠的传输层协议,在UDP的基础上引入了通信双方的确认机制,在数据包丢失收不到确认的情况,会有重发机制。下面详细阐述一下TCP确认机制:

TCP确认机制:三次握手/四次挥手

通过WareShark抓包工具详细看一下这一过程。
三次握手
三次握手过程
可以看到,在HTTP请求之前有三次TCP的连接建立过程,这就是所谓的”三次握手”。

  1. 客户端请求建立连接,SYN位–置1,Seq=0
  2. 服务端收到请求,允许建立连接,并发送”通知”给客户端,SYN位–置1、ACK位–置1,Seq=0
  3. 客户端收到服务端响应,返回消息给服务端,ACK位–置1

四次挥手
四次挥手

  1. 请求端(可能是客户端也可能是服务器,这里是服务端发起)发送终止信号,FIN位(连接中断位)–置1、ACK位(此处是应答标识,不是Ack。一个是响应标识,一个是应答码)–置1。Seq=19815,ACK=443
  2. 响应端收到信号,先返回一条信息(可以理解为:我收到你的分手消息,但是我可能还有点事),ACK位–置1。Seq=443,Ack=19816(可以看到接收方的Seq为请求方的Ack,接收方的Ack为请求方Seq+1)
  3. 响应端觉得自己也没啥留恋的了!也发送终止信号,FIN位–置1、ACK位–置1。Seq=443、Ack=19816
  4. 请求端收到响应端信号,返回消息。ACK位–置1。Seq=19816、Ack=444

标识位(FIN、ACK)以红色方框与箭头标识,应答码(Ack)以红色圆框标识。
标志位详解

相关问题

为什么是三次握手而不是两次?
两次握手:发送方发送请求,接收方确认然后建立连接,这似乎也没什么不对。其实这里会有可靠性或其它问题:

  1. 网络延时的情况下,发送方收到接收方可以建立连接的确认存在时延,而此时接收方(如服务器)可能已经在等待期后认为此次发送方(客户端)已取消请求,将本次连接句柄废弃将资源用于处理其它请求。那么本次连接将不再可靠。
  2. 网络延时的情况下,客户端建立连接的请求到达服务器可能存在时延,当服务器接收到本次请求时,客户端可能已经放弃本次请求。而服务器不知道,会建立句柄资源等待客户端发送数据包。这种情况会造成服务器资源被白白耗费。

TCP处理网络拥堵

既然是网络通信,免不了面对网络情况不佳的情况,这种情况在底层传输又分为多种情况,如:网络闪断、网络卡顿等等。TCP通过确认与重发机制保证传输的可靠性,但是在网络卡顿的情况下还要额外处理数据包拥堵短时间大量发送的情况。

TCP对于阻塞控制有四种算法:慢开始、阻塞避免、快重传以及快恢复,这一块不在这展开,参考:【网络&通信协议系列(四)】TCP拥塞控制

应用层协议

应用层协议专注通信内容的数据格式。

前面讲到的几个下层协议已经可以完成程序间的网络通信,考虑到传输层协议UDP/TCP都是基于二进制流的数据传输,而互联网时代数据格式多样性会造成传输过程的不便,所以引入更高级的应用层协议来解决。

日常主要使用到的有HTTP、FTP、SMTP、TELNET、SSH等,以使用到最多的HTTP协议为例讲解。

HTTP协议

HTTP(HyperText Transfer Protocol,超文本传输协议),直观感受下使用频率最高的协议,由Header与Body组成,区分Request Header与Response Header。

请求方在头部指定本次请求的路径、请求方法、期望接收的数据格式(Accept)、本次请求数据格式(Content-Type)、编码、是否长连接等信息。

响应方在头部指定返回状态码、数据格式(Content-Type)、服务器信息、编码、支持跨域等信息。

HTTP状态码

10x:信息类型。代表请求已被接收,需要继续处理
20x:成功。
30x:重定向。
4xx:客户端错误。
5xx:服务器错误。其中600返回码表示:源站没有返回头部,只有消息体。

总结

TCP/IP四层模型是对OSI模型进行了一定程度的“浓缩”,定义了网络通信的整体框架与层级划分,每一层都有不同的协议簇完成各自的工作。

通过层级划分,网络通信自顶向下<->自底向上的主要过程为:

  1. 应用层协议为了实现数据传输的多样性,定义通信的具体格式。应用程序只需要关注业务场景,以特定的格式传输数据即可。由应用层协议转换为下层支持的二进制格式后调用下层协议完成通信。
  2. 传输层使用端口唯一标志特定主机上的应用程序,用户可以直接使用本层协议自行构建网络通信。传输层协议通过IP地址调用下层协议完成通信。
  3. 网络层负责IP地址、路由子网、MAC寻址等过程,总结为通过IP地址获取到目标主机的MAC地址,并调用下层协议完成通信,因为数据包大小的差异,可能存在IP分片。
  4. 链路层负责封装上层数据包、以帧为单位通过物理介质分组发送电信号,发送方式为子网内广播,由接收方机器自行匹配处理。
  5. 接收方收到数据包返回响应又是同样的过程。

如下图所示:
HTTP协议数据传输过程

参考资料

深入浅出TCP/IP协议栈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值