002 TCP/IP协议详解(一)

时间:2021-07-13 22:55:09   收藏:0   阅读:29

TCP/IP

TCP/IP 意味着 TCP 和 IP 在一起协同工作。

TCP 负责应用软件(比如你的浏览器)和网络软件之间的通信。

IP 负责计算机之间的通信。

TCP 负责将数据分割并装入 IP 包,然后在它们到达的时候重新组合它们。

IP 负责将包发送至接受者。

一、网络层中的 IP 协议

1. IP 地址

1.1 IP 地址概述

技术分享图片

1.2 IP 地址由网络和主机两部分标识组成

技术分享图片

IP地址的主机标识

技术分享图片

IP地址的网络标识

1.3 IP 地址的分类

1.4 广播地址

1.5 IP 多播

技术分享图片

1.6 子网掩码

技术分享图片

技术分享图片

2. 路由

2.1 IP 地址与路由控制

技术分享图片

路由控制表与 IP 包发送

3. IP 分包与组包

3.1 路径 MTU 发现

4. IPv6

4.1 IPv6 的特点

4.2 IPv6 中 IP 地址的标记方法

4.3 IPv6 地址的结构

技术分享图片

4.4 全局单播地址

技术分享图片

全局单播地址

4.5 链路本地单播地址

技术分享图片

链路本地单播地址

4.6 唯一本地地址

技术分享图片

唯一本地地址

4.7 IPv6 分段处理

二、IP 协议

**IP(Internet Protocol,因特网协议)**是网络层的核心协议,规定了网络层的封装规范,将上层(传输层)传递下来的数据段附加上 IP 首部封装成 IP 数据包,又称数据报文,IP 数据包同样由包首部和数据两部分组成,这是数据部分实际为传输层的数据段。

技术分享图片

数据包首部长度为 20 字节,数据部分最大长度为 65515 字节,一个 IP 数据包总长达 65535 字节。而下层数据帧的数据部分最长为 1500 个字节,所以如果 IP 数据包的实际长度超过了 1500,就需要对 IP 数据包进行分片处理,由多个数据帧发送。

1、IP 数据包首部

技术分享图片

2、IP 地址

    因为 MAC 地址无法满足复杂的网络环境需求,所以 IP 协议制定了一套逻辑上的网络地址(IP/子网掩码)。IP 地址有 IPv4 和 IPv6 两个版本,通过子网掩码将 IP 地址分为网络号、主机号两个部分,前者标识了一个子网,后者标识了子网中的主机。如果两台主机处在同一子网,那么它们的网络好必须是相同的。IP 地址解决了 “如何轻易的进行子网划分” 的问题。

技术分享图片

此外,还有7个特殊的I P地址,如下图所示。 在这个图中, 0表示所有的比特位全为 0; - 1表示所有的比特位全为 1

netid、 subnetidhostid分别表示不为全0或全1的对应字段。子网号栏为空表示该地址没有进行子网划分。

技术分享图片

3、ARP协议

引入 IP 地址后,接入网络的主机至少拥有一个 IP 地址和 MAC 地址。需要强调的是,IP 地址本质上是一个逻辑地址,为了解决上层复杂的子网架构问题而生,并不能作为最终定位主机的依据,这仍要依靠 MAC 地址来完成。因此,网络层还需要找到一种方法来完成 IP to MAC 的映射,ARP 协议应运而生。

**ARP(Address Resolution Protocol,地址解析协议)**提供了根据 IP 地址来获取 MAC 地址的能力,地址解析之名由此而来。

地址解析原理:主机间的通信时,ARP 协议首先会发起一个请求 IP 数据包,IP 数据包的首部包含有目标主机 IP 地址,这个数据包经由数据链路层、物理介质层,最终广播到子网内所有主机,主机接受到该 IP 数据包后解析出其首部所包含的目标主机 IP 地址,再和自身 IP 地址进行比对。若相同,则根据数据包首部包含的源主机 IP 地址将 MAC 地址返回;若不相同,则丢弃该数据包。同时 ARP 协议还会缓存一份地址映射表在本地,表记录为返回的 MAC 地址和目标主机 IP 地址。下次再需要通信时,ARP 会直接查询地址映射表以提高效率。

4、路由协议

通过 ARP 协议的地址解析原理不难发现,ARP 协议同样具有子网局限性。为了突破这一限制实现跨子网通信,网络层实现了路由协议。

路由协议提供了异构网(子网间)互联的能力,可以将一个子网的 IP 数据包发送到另一个子网。所谓 “路由” 即指导数据包转发的路径信息。路由协议是运行在路由器上的协议,在错综复杂的网络世界中,路由器充当了交通枢纽的角色,它会视实际的网络环境来选择最佳路径进行数据包转发,路由器是网络层的代表设备。

IP 数据包路由原理:主机间的通信时,首先会通过 IP 协议来判断两台主机是否处在同一子网。若是,直接交给 ARP 协议和以太网协议来完成子网广播。若不是,以太网协议则会将 IP 数据包发送到子网网关(一般为路由器)进行路由决策,再经过若干次网关路由转发之后,IP 数据包就进入到目标主机 IP 地址所处的子网中,最后还是通过子网广播完成主机定位。

技术分享图片

可见,路由器和路由协议解决了 “如何隔离子网之间的广播信号” 和 “子网之间的计算机依旧能够通信” 的问题。

5、域名

用于 TCP/IP 地址的名字被称为域名。www.baidu.com就是一个域名。

当你键入一个像https://www.baidu.com/这样的域名,域名会被一种 DNS 程序翻译为数字。

在全世界,数量庞大的 DNS 服务器被连入因特网。DNS 服务器负责将域名翻译为 TCP/IP 地址,同时负责使用新的域名信息更新彼此的系统。

当一个新的域名连同其 TCP/IP 地址一同注册后,全世界的 DNS 服务器都会对此信息进行更新。

三、传输层中的 TCP 和 UDP

TCP/IP 中有两个具有代表性的传输层协议,分别是 TCP 和 UDP。

1. 端口号

数据链路和 IP 中的地址,分别指的是 MAC 地址和 IP 地址。前者用来识别同一链路中不同的计算机,后者用来识别 TCP/IP 网络中互连的主机和路由器。在传输层也有这种类似于地址的概念,那就是端口号。端口号用来识别同一台计算机中进行通信的不同应用程序。因此,它也被称为程序地址。

1.1 根据端口号识别应用

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

技术分享图片

通过端口号识别应用

1.2 通过 IP 地址、端口号、协议号进行通信识别

技术分享图片

技术分享图片

通过端口号、IP地址、协议号进行通信识别

① 和② 的通信是在两台计算机上进行的。它们的目标端口号相同,都是80。这里可以根据源端口号加以区分。

③ 和 ① 的目标端口号和源端口号完全相同,但它们各自的源 IP 地址不同。

此外,当 IP 地址和端口号全都一样时,我们还可以通过协议号来区分(TCP 和 UDP)。

1.3 端口号的确定

1.4 端口号与协议

2. UDP

3. TCP

3.1 三次握手(重点)

下面来看看三次握手的流程图:

技术分享图片

三次握手

3.2 四次挥手(重点)

下面来看看四次挥手的流程图:

技术分享图片

四次挥手

上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况。

具体流程如下图:

技术分享图片

同时挥手

3.3 通过序列号与确认应答提高可靠性

技术分享图片

序列号和确认应答

3.4 重发超时的确定

3.5 以段为单位发送数据

3.6 利用窗口控制提高速度

技术分享图片

3.7 滑动窗口控制

技术分享图片

 

滑动窗口

3.8 窗口控制中的重发控制

在使用窗口控制中, 出现丢包一般分为两种情况:

① 确认应答未能返回的情况。在这种情况下,数据已经到达对端,是不需要再进行重发的,如下图:

技术分享图片

部分确认应答丢失

② 某个报文段丢失的情况。接收主机如果收到一个自己应该接收的序列号以外的数据时,会针对当前为止收到数据返回确认应答。如下图所示,当某一报文段丢失后,发送端会一直收到序号为1001的确认应答,因此,在窗口比较大,又出现报文段丢失的情况下,同一个序列号的确认应答将会被重复不断地返回。而发送端主机如果连续3次收到同一个确认应答,就会将其对应的数据进行重发。这种机制比之前提到的超时管理更加高效,因此也被称为高速重发控制。

技术分享图片

高速重发控制

4、TCP与UDP

技术分享图片

面向报文
面向报文的传输方式是应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。若报文太长,则IP层需要分片,降低效率。若太短,会是IP太小。

面向字节流
面向字节流的话,虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序看成是一连串的无结构的字节流。TCP有一个缓冲,当应用程序传送的数据块太长,TCP就可以把它划分短一些再传送。

关于拥塞控制,流量控制,是TCP的重点,后面讲解。

TCP和UDP协议的一些应用

技术分享图片

什么时候应该使用TCP?

当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。

什么时候应该使用UDP?

当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。

四、TCP 协议

TCP(Transmission Control Protocol,传输控制协议),是一种面向连接的可靠传输协议,提供可靠(无差错、不丢失、不重复、按顺序)的字节流数据传输服务。在传输效率和可靠性之间选择了后者,所以有开销大、传输速度慢的缺点。

TCP 的可靠性传输具有非常复杂的实现细节,包括但不限于:

1、数据段首部

技术分享图片

 

 

技术分享图片

其中的 TCP Flags 字段,是非常重要的功能标识,占 8 位,分别为:

2、TCP连接的建立与终止

下面以三次握手和四次挥手为例,看看数据段首部是怎么进行传输标识并以此来保存可靠性的。

三次握手
技术分享图片

  1. 建立连接时,客户端发送 (SYN=1,seq=x) 数据段到服务器,然后进入 SYN_SENT 状态并等待服务器确认;
  2. 服务器收到 (SYN=1,seq=x) 数据段后,返回 (ACK=1, ack=x+1, SYN=1, seq=y) 数据段,服务器进入 SYN_RECV 状态;
  3. 客户端收到服务器的 ACK 确认后,也会向服务器发送 ACK 确认 (ACK=1, ack=y+1),至此客户端和服务器都进入了 ESTABLISHED 状态。三次握手完成,TCP 连接建立成功。

为什么要使用三次握手来保证数据传输的可靠性?
“握手” 的行为实际上为了告知收发双方自己的 ISN(Initial Sequence Number,初始化序号),如上图的 seq=x 或 seq=y,这个数值会被作为建立连接之后进行顺序数据传输的依据。从数据段首部的 Sequence Number 和 Acknowledgment Number 都占 32 位可知,seq 和 ack 的取值范围均为 [0, 2^32-1],顺序循环使用。需要注意的是,seq 并未每次都是从 0 开始的,TCP 协议会以 4μs 一次的频率进行 ISN+=1 操作,以此来避免 TCP 重连时会出现同一条连接中存在两个及以上 seq 相同的包,最终导致顺序错乱。

四次挥手
技术分享图片

  1. 断开连接时,客户端发送 (FIN=1, seq=m) 数据段,其中 m 的数值为客户端最后一次向服务器发送的数据段的最后一个字节的序号再加上 1,客户端进入 FIN-WAIT-1 状态。
  2. 服务器接收到 (FIN=1, seq=m) 之后,返回 (ACK=1, ack=m+1, seq=n) 确认数据段,服务器进入 CLOSE-WAIT 状态。
  3. 服务器再向客户端发送 (FIN=1, seq=u, ACK=1, ack=m+1) 数据段,服务器进入 LAST-ACK 状态。
  4. 客户端接收到 (FIN=1, seq=u, ACK=1, ack=m+1) 数据段后,返回 (ACK=1, ack=u+1, seq=m+1) 确认数据段,服务器和客户端都进入 CLOSED 状态。四次挥手完成,TCP 连接就此断开。

 

为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

 

为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

原因有二:

一、保证TCP协议的全双工连接能够可靠关闭

二、保证这次连接的重复数据段从网络中消失

先说第一点,如果Client直接CLOSED了,那么由于IP协议的不可靠性或者是其它网络原因,导致Server没有收到Client最后回复的ACK。那么Server就会在超时之后继续发送FIN,此时由于Client已经CLOSED了,就找不到与重发的FIN对应的连接,最后Server就会收到RST而不是ACK,Server就会以为是连接错误把问题报告给高层。这样的情况虽然不会造成数据丢失,但是却导致TCP协议不符合可靠连接的要求。所以,Client不是直接进入CLOSED,而是要保持TIME_WAIT,当再次收到FIN的时候,能够保证对方收到ACK,最后正确的关闭连接。

再说第二点,如果Client直接CLOSED,然后又再向Server发起一个新连接,我们不能保证这个新连接与刚关闭的连接的端口号是不同的。也就是说有可能新连接和老连接的端口号是相同的。一般来说不会发生什么问题,但是还是有特殊情况出现:假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中,这些延迟数据在建立新连接之后才到达Server,由于新连接和老连接的端口号是一样的,又因为TCP协议判断不同连接的依据是socket pair,于是,TCP协议就认为那个延迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混淆了。所以TCP连接还要在TIME_WAIT状态等待2倍MSL,这样可以保证本次连接的所有数据都从网络中消失。

3、TCP的状态变迁图

技术分享图片

 

 

五、UDP协议

UDP(User Datagram Protocol,用户数据报协议),是一种无连接的非可靠传输层协议。UDP 不提供数据包分组、组装,不能对数据段进行排序,所以 UDP 数据段的首部非常简单。换句话说,当数据段发送出去之后,发送方是无法得知其是否完整且安全的到达了接收方的。这样的传输机制决定了它的最大优点就是快,同时也决定了它最大的缺点不可靠、不稳定。

1、UDP 数据段首部:

技术分享图片

 

技术分享图片

 

技术分享图片

2、IP分片

技术分享图片

 

 

3、ICMP不可达差错(需要分片)

技术分享图片

六、参考资料

1、https://www.cnblogs.com/jmilkfan-fanguiju/p/10589771.html

2、https://developer.51cto.com/art/201906/597961.htm

3、https://blog.csdn.net/mumubumaopao/article/details/107860818

4、https://blog.csdn.net/bjweimengshu/article/details/79214572

5、https://blog.csdn.net/bjweimengshu/article/details/79214572

6、https://blog.csdn.net/weixin_44198965/article/details/90083126

 

原文:https://www.cnblogs.com/linford/p/14995572.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!