TCP/IP

TCP/IP

Open System Interconnect开放系统互连参考模型

网络中传输的数据包由两部分组成

一部分是协议所要用到的首部,另一部分是上一层传过 来的数据。包首部就像协议的脸。

不同层结构的地址:

  • 传输层的地址:端口号

端口号用来识别同一台计算机中进行通信的不同应用程序。因

此,它也被称为程序地址。

  • 网络层 :ip地址

ip地址来识别 TCP/IP 网络中互连的主机和路由器。

  • 数据链路层:MAC地址

MAC地址识别同一链路中不同 的计算机

UDP 常用于一下几个方面:

1.包总量较少的通信(DNS、SNMP等);

2.视频、音频等多媒体通信(即时通信);

3.限定于 LAN 等特定网络中的应用通信;

4.广播通信(广播、多播)。

三次握手(建立连接)

1.第一次握手:

​ 客户端将标志位SYN(SYN:同步序列编号)置为1,随机产生一个值seq=J,并将该数据包发送给服务器端,客户端进入SYN_SENT状态,等待服务器端确认。

2.第二次握手:

​ 服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。

3.第三次握手:

​ 客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED(TCP连接成功)状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。

问:三次握手中,为什么客户机最后还要再向服务器发送一次确认呢?

答:这是为了防止已失效的连接请求报文段突然又传到了服务器。所谓“已失效的连接请求报文段”是这样产生的。考虑一种正常的情况,客户机发出连接请求,但因为连接请求报文丢失而未收到确认。于是客户机再重传了一次连接请求,后来收到了确认,建立了连接。数据传输完后,就释放了连接。客户机共发送了两个连接请求报文段,其中第一个丢失,第二个到达了服务器,没有所谓的“已失效的连接请求报文段”。

  但是如果出现了一种异常情况,即客户机发出的第一个报文段并没有丢失,而是在某个节点上长时间滞留了,直至客户机向服务器发送了第二个报文段并且已经完成数据传输释放了连接,此时,第一个报文到达服务器后会被误以为是客户机重新发起的一次连接请求,实质上是一个早已失效的连接请求。如果没有第三次握手,那么这个连接就建立了,但是客户机并不会向服务器发送任何请求,这样连接就会一直持续,白白的消耗网络资源。

四次挥手(断开连接)

  • 一方发起一方接受

中断连接端可以是客户端,也可以是服务器端。

1.第一次挥手:

​ 客户端发送一个FIN=M,用来关闭客户端到服务器端的数据传送,客户端进入FIN_WAIT_1状态。意思是说”我客户端没有数据要发给你了”,但是如果你服务器端还有数据没有发送完成,则不必急着关闭连接,可以继续发送数据。

2.第二次挥手:

​ 服务器端收到FIN后,先发送ack=M+1,告诉客户端,你的请求我收到了,但是我还没准备好,请继续你等我的消息。这个时候客户端就进入FIN_WAIT_2状态,继续等待服务器端的FIN报文。

3.第三次挥手:

​ 当服务器端确定数据已发送完成,则向客户端发送FIN=N报文,告诉客户端,好了,我这边数据发完了,准备好关闭连接了。服务器端进入LAST_ACK状

态。

4.第四次挥手:

​ 客户端收到FIN=N报文后,就知道可以关闭连接了,但是他还是不相信网络,怕服务器端不知道要关闭,所以发送ack=N+1后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。服务器端收到ACK后,就知道可以断开连接了。客户端等待了2MSL(最大报文生存时间)后依然没有收到回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。最终完成了四次挥手。

  • 同时关闭

问:为什么客户机发送完最后一个数据后要在TIME-WAIT状态等待 2MSL(四分钟)的时间呢?

​ 答:第一:为了保证客户机最后发送的那个ACK报文段能够到达服务器。这个ACK报文段可能会丢失。因而使处在LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认。服务器会超时重传这个FIN+ACK报文段,而客户机就能在2MSL时间内收到这个重传的FIN+ACK报文段。接着客户机重传一次确认,重新启动2MSL计时器,最后客户机和服务器都可以进入到CLOSED(关闭)状态。如果没有2MSL等待时间,那么就无法收到重传的FIN+ ACK包,无法进入正常的CLOSED状态。

​ 第二,防止“已失效的连接请求报文段”出现在本连接中。客户机在发送完最后一个ACK报文段,再经过时间2MSL,就可以使本连接持续的时间内所产生的报文段都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。

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

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

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

​ 当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知。这个消息叫做确认应答(ACK)。当发送端将数据发出之后会等待对端的确认应答。如果有确认应答,说明数据已经成功到达对端。在一定时间内没有等待到确认应答,发送端就可以认为数据已经丢失,并进行重发。由此,即使产生了丢包,仍然能够保证数据能够到达对端,实现可靠传输。

序列号是按照顺序给发送数据的每一个字节(8位字节)都标上号码的编号。接收端查询接收数据 TCP 首部中的序列号和数据的长度,将自己下一步应该接收的序列号作为确认应答返送回去。通过序列号和确认应答号,TCP 能够识别是否已经接收数据,又能够判断是否需要接收,从而实现可靠传输。

重发超时的确定

​ 重发超时是指在重发数据之前,等待确认应答到来的那个特定时间间隔。如果超过这个时间仍未收到确认应答,发送端将进行数据重发。每次发包时都会计算往返时间及其偏差。将这个往返时间和偏差时间相加,重发超时的时间就是比这个总和要稍大一点的值(0.5秒的倍数)。数据被重发之后若还是收不到确认应答,则进行再次发送。此时,等待确认应答的时 间将会以2倍、4倍的指数函数延长

​ 数据也不会被无限的、反复地重发。达到一定重发次数之后,如果仍没有任何确认应答返回,就会判断为网络或对端主机发生了异常,强制关闭连接。并且通知应用通信异常强行终止。

MSS(最大报文段长度)

TCP 在传送大量数据时,是以 MSS 的大小将数据进行分割发送。进行重发时也是以MSS 为单位。

MSS 在三次握手的时候,在两端主机之间被计算得出。

最理想的情况是,最大段消息长度正好是 IP 中不会被分片处理的最大段数据长度。

利用窗口控制提高速度

​ TCP 以1个段为单位,每发送一个段进行一次确认应答的处理。这样的传输方式有一个 缺点,就是包的往返时间越长通信性能就越低。

​ 窗口大小就是指无需等待确认应答而可以继续发送数据的最大值。这个机制实现了使用大量的缓冲区,通过对多个段同时进行确认应答的功能。

​ 收到确认应答的情况下,将窗口滑动到确认应答中的序列号的位置。这样可以顺序地 将多个段同时发送提高通信性能。这种机制也别称为滑动窗口控制

​ 某个报文段丢失的情况。接收主机如果收到一个自己应该接收的序列号以外的数据时,会针对当前为止收到数据返回确认应答。而发送端主机如果连续3次收到同一个确认应答,就会将其对应的数据进行重发。这种机制比之前提到的超时管理更加高效,因此也被称为高速重发控制。

网络层中的 IP 协议

​ IP(IPv4、IPv6)相当于 OSI 参考模型中的第3层——网络层。网络层的主要作用是“实现终端节点之间的通信”。这种终端节点之间的通信也叫“点对点通信”。IP 大致分为三大作用模块,它们是 IP 寻址、路由(最终节点为止的转发)以及 IP 分包与组包。

ip地址

​ IP 地址用于在“连接到网络 中的所有主机中识别出进行通信的目标地址”在 TCP/IP 通信中所有主机或路 由器必须设定自己的 IP 地址。

​ IP 地址(IPv4 地址)由32位正整数来表示。IP 地址在计算机内部以二进制方式被处理。然而,由于我们并不习惯于采用二进制方式,我们将32位的 IP 地址以每8位为一 组,分成4组,每组以 “.” 隔开,再将每组数转换成十进制数。

IP 地址的分类

​ IP 地址分为四个级别,分别为A类、B类、C类、D类。它根据 IP 地址中从第 1 位到 第 4 位的比特列对其网络标识和主机标识进行区分。第 4 位的比特列对其网络标识和主机标识进行区分。

A 类 IP 地址是首位以 “0” 开头的地址。从第 1 位到第 8 位是它的网络标识。0.0.0.0~127.0.0.0 是 A 类的网络地址。A 类地址的后 24 位相当于主机标识。因此,一个网段内可容纳的主机地址上限为16,777,214个。

B 类 IP 地址是前两位 “10” 的地址。从第 1 位到第 16 位是它的网络标识。128.0.0.0~191.255.0.0是 B 类的网络地址。B 类地址的后 16 位相当于 主机标识。因此,一个网段内可容纳的主机地址上限为65,534个。、

C 类 IP 地址是前三位为 “110” 的地址。从第 1 位到第 24 位是它的网络标识。192.0.0.0~223.255.255.0 是 C 类的网络地址。C 类地址的后 8 位 相当于主机标识。因此,一个网段内可容纳的主机地址上限为254个。

D 类 IP 地址是前四位为 “1110” 的地址。从第 1 位到第 32 位是它的网络标识。224.0.0.0~239.255.255.255 是 D 类的网络地址。D 类地址没有主机标识,常用于多播。

​ 在分配 IP 地址时关于主机标识有一点需要注意。即要用比特位表示主机地址时,不可以全部为 0 或全部为 1。因为全部为 0 只有在表示对应的网络地址或 IP 地址不可以获知的情况下才使用。而全部为 1 的主机通常作为广播地址。因此,在分配过程中,应该去掉这两种情况。这也是为什么 C 类地址每个网段最多只能有 254( 28- 2 =254)个主机地址的原因。

子网掩码

​ 子网掩码用二进制方式表示的话,也是一个 32 位的数字。它对应 IP 地址网络标识部 分的位全部为 “1”,对应 IP 地址主机标识的部分则全部为 “0”。由此,一个 IP 地址可以不再受限于自己的类别,而是可以用这样的子网掩码自由地定位自己的网络标识长度。子网掩码必须是 IP 地址的首位开始连续的 “1”。

ip包

​ T T L(t i m e - t o - l i v e)生存时间字段设置了数据报可以经过的最多路由器数。它指定了数据 报的生存时间。T T L的初始值由源主机设置(通常为 3 2或6 4),一旦经过一个处理它的路由器, 它的值就减去 1。当该字段的值为 0时,数据报就被丢弃,并发送 I C M P报文通知源主机。

路由

​ 仅有 IP 地址还不足 以实现将数据包发送到对端目标地址,在数据发送过程中还需要路由控制表。该路由控制表的形成方式有两种:一种是管理员手动设置,另一种是路由器与其他路 由器相互交换信息时自动刷新。前者也叫做静态路由控制,而后者叫做动态路由控制。

​ IP 地址的网络地址部分用于进行路由控制。 路由控制表中记录着网络地址与下一步应该发送至路由器的地址。 在发送 IP 包时,首先要确定 IP 包首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将 IP 包转发给相应的下一个路由器。

IP 分包与组包

每种数据链路的最大传输单元(MTU)都不尽相同,因为每个不同类型的数据链路的使 用目的不同。经过分片之后的 IP 数据报在被重组的时候,只能由目标主机进行。路由器虽然做分片但不会进行重组。

路径MTU发现

如果两台主机之间的通信要通过多个网络,那么每个网络的链路层就可能有不同的MTU。两台通信主机路径中的最小MTU。它被称作路径MTU(PMTU)。进行路径 MTU 发现,就可以避免在中途的路由器上进行分片处理,也可以在 TCP 中发送更大的包。

IPv6

​ IPv6(IP version 6)是为了根本解决 IPv4 地址耗尽的问题而被标准化的网际协议。 IPv4 的地址长度为 4 个 8 位字节,即 32 比特。而 IPv6 的地址长度则是原来的 4 倍,即 128 比特,一般写成 8 个 16 位字节。

IPv6 的特点

  1. IP 得知的扩大与路由控制表的聚合。
  2. 包首部长度采用固定的值(40字节),不再采用首部检验码。简化首部结构,减轻路由器负担。路由器不再做分片处理。
  3. 支持即插即用功能。即使没有DHCP服务器也可以实现自动分配 IP 地址。
  4. 采用认证与加密功能。应对伪造 IP 地址的网络安全功能以及防止线路窃听的功能。
  5. 多播、Mobile IP 成为扩展功能。

Ipv6地址

​ 一般人们将 128 比特 IP 地址以每 16 比特为一组,每组用冒号(“:”)隔开进行标 记。 而且如果出现连续的 0 时还可以将这些 0 省略,并用两个冒号(“::”)隔开。但 是,一个 IP 地址中只允许出现一次两个连续的冒号。IPv6 分段处理 IPv6 的分片处理只在作为起点的发送端主机上进行,路由器不参与分片。 IPv6 中最小 MTU 为 1280 字节。

地址解析协议 ARP

•网络层实现主机之间的通信,而链路层实现具体每段链路之间的通信。因此在通信过程中,IP 数据报的源地址和目的地址始终不变,而 MAC 地址随着链路的改变而改变。ARP 实现由 IP 地址得到 MAC 地址。每个主机都有一个 ARP 高速缓存,里面有本局域网上的各主机和路由器的 IP 地址到 MAC 地址的映射表。

如果主机 A 知道主机 B 的 IP 地址,但是 ARP 高速缓存中没有该 IP 地址到 MAC 地址的映射,此时主机 A 通过广播的方式发送 ARP 请求分组,主机 B 收到该请求后会发送 ARP 响应分组给主机 A 告知其 MAC 地址,随后主机 A 向其高速缓存中写入主机 B 的 IP 地址到 MAC 地址的映射。

网际控制报文协议 ICMP

iCMP经常被认为是 I P层的一个组成部分。它传递差错报文以及其他需要注意的信息。当传送IP数据包发生错误比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机。给主机一个处理错误的机会,这 也就是为什么说建立在IP层以上的协议是可能做到安全的原因。

DNS

我们平常在访问某个网站时不适用 IP 地址,而是用一串由罗马字和点号组成的字符 串。而一般用户在使用 TCP/IP 进行通信时也不使用 IP 地址。域名系统(Domain Name System缩写DNS,Domain Name被译为域名)是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。

DHCP(动态主机配置协议)

是一个局域网的网络协议。指的是由服务器控制一段lP地址范围,客户机登录服务器时就可以自动获得服务器分配的lP地址和子网掩码。

NAT(Network Address Translator网络地址转换)

是用于在本地网络中使用私有地址,在连接互 联网时转而使用全局 IP 地址的技术。

IP 隧道

IP隧道是指一种可在两网络间用网际协议进行通信的通道。在该通道里,会先封装其他网络协议的数据包,之后再传输信息。实现不同网络环境的通信(例如ipv4和ipv6)

打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2020 lsengard
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信