深入理解网络通信和TCP/IP协议

计算机网络

定义和分类

计算机网络的标准定义是:利用通信线路将地理上分散的、具有独立功能的计算机系统和通信设备按不同的形式连接起来,以功能完善的网络软件及协议实现资源共享和信息传递的系统。

计算机网络从覆盖范围上划分可以分为三类:局域网、城域网、广域网。局域网 LAN(作用范围一般为几米到几十公里)、城域网 MAN(界于 WAN 与 LAN 之间)、广域网 WAN(作用范围一般为几十到几千公里)。当然计算机网络划分不止这一种分类方式。

拓扑结构分类(总线型、环型、星型、网状)

按信息的交换方式(电路交换、报文交换、报文分组交换)来分等等方式

计算机网络体系结构

OSI 七层模型

OSI 采用了分层的结构化技术,共分七层,物理层、数据链路层、网络层、传输层、会话层、表示层、应用层

TCP/IP 模型

OSI 模型比较复杂且学术化,所以我们实际使用的 TCP/IP 模型,分 5 层。

无论什么模型,每一个抽象层建立在低一层提供的服务上,并且为高一层提供服务。大致来说,可以这么理解(只是帮助我们理解,实际上肯定会有点出入),对于我们的 PC 机来说。

  • 物理层可以看成网卡
  • 数据链路层可以看成网卡驱动程序
  • 网络层和传输层由操作系统负责处理,
  • 应用层则是常用的一些网络应用程序和我们自己所编写的网络应用程序。

TCP/IP 协议族

Transmission Control Protocol/Internet Protocol 的简写,中译名为传输控制协议/因特网互联协议,是 Internet 最基本的协议、Internet 国际互联网络的基础,由网络层的 IP 协议和传输层的 TCP 协议组成。协议采用了 5 层的层级结构。然而在很多情况下,它是利用 IP 进行通信时所必须用到的协议群的统称。也就是说,它其实是个协议家族,由很多个协议组成,并且是在不同的层, 是互联网的基础通信架构。

IP

是 TCP/IP 中非常重要的协议,往往用来确定网络中唯一的一台计算设备,它的作用就好比我们现实生活中的电话号码或者或者通讯地址。这层负责对数据加上 IP 地址(有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址))和其他的数据以确定传输的目标。

而 TCP 和 UDP 都是传输层的协议,传输层主要为两台主机上的应用程序提供端到端的通信。

TCP

有点类似于我们日常生活中的打电话,电话接通后通过“喂”确认对方身份,听不清会要求对方重说,对方说的太快了会要求对方说慢点,讲完了各说一句“再见”结束通话。

TCP 提供了一种可靠的数据传输服务,TCP 是面向连接的,也就是说,利用 TCP 通信的两台主机首先要经历一个建立连接的过程,等到连接建立后才开始传输数据,而且传输过程中采 用“带重传的肯定确认”技术来实现传输的可靠性。TCP 还采用一种称为“滑动窗口”的方式进行流量控制,发送完成后还会关闭连接。

UDP(User Datagram Protocol 的简称, 中文名是用户数据报协议)

有点类似于我们日常生活中通过不靠谱的物流系统寄东西。UDP 是把数据直接发出去,而不管对方是不是在接 收,也不管对方是否能接收的了,也不需要接收方确认,

属于不可靠的传输,可能会出现丢包现象,实际应用中要求程序员编程验证。所以 TCP 要比 UDP 可靠的多。

我们一些常见的网络应用基本上都是基于 TCP 和 UDP 的,这两个协议又会使用网络层的 IP 协议。但是我们完全可以绕过传输层的 TCP 和 UDP,直接使用 IP,比如 Linux 内核中的

LVS 就可以直接基于 IP 层进行负载平衡调度;甚至还可以直接访问链路层,比如 tcpdump程序就是直接和链路层进行通信的

TCP/IP 网络传输中的数据

每个分层中,都会对所发送的数据附加一个首部,在这个首部中包含了该层必要的信息,如发送的目标地址以及协议相关信息。通常,为协议提供的信息为包首部,所要发送的内容为数据。

在下一层的角度看,从上一层收到的包全部都被认为是本层的数据。

在数据包的首部,明确标明了协议应该如何读取数据。反过来说,看到首部,也就能够了解该协议必要的信息以及所要处理的数据。我们用用户 A 发送,用户 B 接受来说说明:

  • 用户 A 应用程序处理
  • 首先应用程序会进行编码处理产生报文/消息(message)交给下面的 TCP 层。
  • 用户 A TCP 模块的处理
  • TCP 根据应用的指示,负责建立连接、发送数据以及断开连接。TCP 提供将应用层发来的数据顺利发送至对端的可靠传输。为了实现这一功能,需要将应用层数据封装为报文段(segment)并附加一个 TCP 首部然后交给下面的 IP 层。
  • 用户 A IP 模块的处理
  • IP 将 TCP 传过来的 TCP 首部和 TCP 数据合起来当做自己的数据,并在 TCP 首部的前端加上自己的 IP 首部生成 IP 数据报(datagram)然后交给下面的数据链路层。
  • 用户 A 数据链路层的处理
  • 从 IP 传过来的 IP 包对于数据链路层来说就是数据。给这些数据附加上链路层首部封装为链路层帧(frame),生成的链路层帧(frame)将通过物理层传输给接收端。
  • 用户 B 数据链路层的处理
  • 用户 B 主机收到链路层帧(frame)后,首先从链路层帧(frame)首部找到 MAC 地址判断是否为发送给自己的包,若不是则丢弃数据。如果是发送给自己的包,则从以太网包首部中的类型确定数据类型,再传给相应的模块,如IP、ARP 等。这里的例子则是 IP 。
  • 用户 B IP 模块的处理
  • IP 模块接收到 数据后也做类似的处理。从包首部中判断此对 IP 地址是否与自己的 IP 地址匹配,如果匹配则根据首部的协议类型将数据发送给对应的模块,如 TCP、UDP。这里的例子则是 TCP。
  • 用户 B TCP 模块的处理
  • 在 TCP 模块中,首先会计算一下校验和,判断数据是否被破坏。然后检查是否在按照序号接收数据。最后检查端口号,确定具体的应用程序。数据被完整地接收以后,会传给由端口号识别的应用程序。
  • 用户 B 应用程序的处理
  • 接收端应用程序会直接接收发送端发送的数据。通过解析数据,展示相应的内容。

地址和端口号

MAC地址

MAC 地址全称叫做媒体访问控制地址,也称为局域网地址(LAN Address),MAC 位址,以太网地址(Ethernet Address)或物理地址(Physical Address),

由网络设备制造商生产时写在硬件内部。MAC 地址与网络无关,也即无论将带有这个地址的硬件(如网卡、集线器、路由器等)接入到网络的何处,都有相同的 MAC 地址,它由厂商写在网卡的 BIOS 里,从理论上讲,除非盗来硬件(网卡),否则是没有办法冒名顶替的。

MAC 地址共 48 位(6 个字节)。前 24 位由 IEEE(电气和电子工程师协会)决定如何分配,后 24 位由实际生产该网络设备的厂商自行制定。

例如:FF:FF:FF:FF:FF:FF 或 FF-FF-FF-FF-FF-FF

IP地址

IP 地址(Internet Protocol Address)的全称叫作互联网协议地址,它的本义是为互联网上的每一个网络和每一台主机配置一个唯一的逻辑地址,用来与物理地址作区分。所以 IP 地址用来识别 TCP/IP 网络中互连的主机和路由器。IP 地址基于逻辑,比较灵活,不受硬件限制,也容易记忆。

IP 地址分为:IPv4 和 IPv6。我们这里着重讲的是 IPv4 地址,IP 地址是由 32 位的二进制数组成,它们通常被分为 4 个“8 位二进制数”,我们可以把它理解为 4 个字节,格式表示为:(A.B.C.D)。其中,A,B,C,D 这四个英文字母表示为 0-255 的十进制的整数。例:192.168.1.1

Tips:IP 地址和 MAC 地址之间的区别

1、对于网络中的一些设备,路由器或者是 PC 及而言,IP 地址的设计是出于拓扑设计出来的,只要在不重复 IP 地址的情况下,它是可以随意更改的;而 MAC 地址是根据生产厂商烧录好的,它一般不能改动的,一般来说,当一台 PC 机的网卡坏了之后,更换了网卡之后 MAC 地址就会变了。

2、在前面的介绍里面,它们最明显的区别就是长度不同,IP 地址的长度为 32 位,而MAC 地址为 48 位。

3、它们的寻址协议层不同。IP 地址应用于 OSI 模型的网络层,而 MAC 地址应用在 OSI模型的数据链路层。 数据链路层协议可以使数据从一个节点传递到相同链路的另一个节点上(通过 MAC 地址),而网络层协议使数据可以从一个网络传递到另一个网络上(ARP 根据目的 IP 地址,找到中间节点的 MAC 地址,通过中间节点传送,从而最终到达目的网络)。

4、分配依据不同。IP 地址的分配是基于我们自身定义的网络拓扑,MAC 地址的分配是基于制造商。

端口号

在传输层也有这种类似于地址的概念,那就是端口号。端口号用来识别同一台计算机中进行通信的不同应用程序。

因此,它也被称为程序地址。一台计算机上同时可以运行多个程序。传输层协议正是利用这些端口号识别本机中正在进行通信的应用程序,并准确地将数据传输。

TCP特性

TCP三次握手

当一台计算机(通常是客户端)想要与另一台计算机(通常是服务器)建立TCP连接时,它会发送一个带有SYN标志位的TCP报文,这个报文称为SYN报文,用于发起连接请求。

另一台计算机接收到SYN报文后,如果它同意建立TCP连接,它会发送一个带有SYN和ACK标志位的TCP报文,这个报文称为SYN/ACK报文,用于确认收到连接请求,并同步双方的初始序列号。

最后,发起连接请求的计算机再发送一个带有ACK标志位的TCP报文,用于确认连接已经建立。

概念解析

  • SYN
  • SYN是TCP协议中的一个标志位,意为同步序列号
  • SEQ
  • Sequence Number(序列号)的缩写,用于标识每个TCP报文中的数据字节的顺序。在三次握手过程中,第一次握手中的SEQ字段表示发送方的初始序列号。
  • 第二次握手中的SYN字段,则表示接收方期望收到的下一个数据字节的序列号,也就是ACK字段中所确认的序列号加1。这样,在第三次握手中,发送方就可以用ACK字段确认接收方已经收到了它的数据,并开始向接收方发送数据。
  • ACK是Acknowledgement(确认)的缩写,
  • 用于确认接收方已经收到了发送方的数据。
  • 总结
  • ACK用于确认数据是否被接收,SEQ用于标识数据的顺序。

为什么需要三次握手

TCP 是可靠的传输控制协议,而三次握手是保证数据可靠传输又能提高传输效率的最小次数。

三次握手的过程即是通信双方相互告知序列号起始值,并确认对方已经收到了序列号起始值的必经步骤。

例子:发送方在发送数据包(假设大小为 10 byte)时, 同时送上一个序号( 假设为 500),那么接收方收到这个数据包以后, 就可以回复一个确认号(510 = 500 + 10) 告诉发送方 “我已经收到了你的数据包, 你可以发送下一个数据包, 序号从 511 开始”

TCP 的三次握手的漏洞-SYN 洪泛攻击

三次握手中的第二次握手,服务端向客户端应答请求,应答请求是需要客户端 IP 的,而且因为握手过程没有完成,操作系统使用队列维持这个状态(Linux 2.2 以后,这个队列大小参数可以通过/proc/sys/net/ipv4/tcp_max_syn_backlog 设置)。

于是攻击者就伪造这个 IP,往服务器端狂发送第一次握手的内容。由于第一次握手中的客户端 IP 地址是伪造的,从而服务端忙于进行第二次握手,但是第二次握手是不会有应答的,所以导致服务器队列满,而拒绝连接。

面对这种攻击,有以下的解决方案,最好的方案是防火墙。

  • 无效连接监视释放
  • 这种方法不停监视所有的连接,包括三次握手的,还有握手一次的,反正是所有的,当达到一定(与)阈值时拆除这些连接,从而释放系统资源。这种方法对于所有的连接一视同仁,不管是正常的还是攻击的,所以这种方式不推荐。
  • 延缓 TCB 分配方法
  • 一般的做完第一次握手之后,服务器就需要为该请求分配一个 TCB(连接控制资源),通常这个资源需要 200 多个字节。延迟 TCB 的分配,当正常连接建立起来后再分配 TCB 则可以有效地减轻服务器资源的消耗。
  • 使用防火墙
  • 防火墙在确认了连接的有效性后,才向内部的服务器(Listener)发起 SYN 请求。

TCP 四次挥手(分手)

由于 TCP 连接是全双工的,因此,每个方向都必须要单独进行关闭。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。

为什么 TCP 的挥手需要四次?

TCP 是全双工的连接,必须两端同时关闭连接,连接才算真正关闭。

如果一方已经准备关闭写,但是它还可以读另一方发送的数据。发送给 FIN 结束报文给对方,对方收到后,回复 ACK 报文。当这方(接收方)也已经写完了准备关闭,发送 FIN 报文,对方回复 ACK。两端都关闭,TCP 连接正常关闭。

为什么需要 TIME-WAIT 状态?

TIME_WAIT 状态存在的原因有两点

1、可靠的终止 TCP 连接。

2、保证让迟来的 TCP 报文有足够的时间被识别并丢弃。

根据前面的四次握手的描述,我们知道,客户端收到服务器的连接释放的 FIN 报文后,必须发出确认。如最后这个 ACK 确认报文丢失,那么服务器没有收到这个 ACK 确认报文,就要重发 FIN 连接释放报文,客户端要在某个状态等待这个 FIN 连接释放报文段然后回复确认报文段,这样才能可靠的终止 TCP 连接。

在 Linux 系统上,一个 TCP 端口不能被同时打开多次,当一个 TCP 连接处于 TIME_WAIT状态时,我们无法使用该链接的端口来建立一个新连接。

反过来思考,如果不存在 TIME_WAIT状态,则应用程序能过立即建立一个和刚关闭的连接相似的连接(这里的相似,是指他们具有相同的 IP 地址和端口号)。这个新的、和原来相似的连接被称为原来连接的化身。新的化身可能受到属于原来连接携带应用程序数据的 TCP 报文段(迟到的报文段),这显然是不该发生的。这是 TIME_WAIT 状态存在的第二个原因。

  • 20
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码匠心印记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值