前端需要知道的计算机网络知识----TCP/IP协议

496 阅读20分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第12天,点击查看活动详情

一、简介

TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。 TCP/IP协议不仅仅指的是TCP和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。

2.1 网络模型

img

协议
应用层(application layer)例如HTTP、FTP、DNS(如BGP和RIP这样的路由协议,尽管由于各种各样的原因它们分别运行在TCP和UDP上,仍然可以将它们看作网络层的一部分)
传输层(transport layer)例如TCP、UDP、RTP、SCTP
网络层(internet layer)对于TCP/IP来说这是因特网协议(IP)
数据链路层(Network Access (link) layer)以太网,wifi , 蓝牙工作在这一层,网络访问层提供了主机连接到屋里网络需要的硬件和相关的协议

从上图可以看出TCP/IP模型和OSI模型在分层上的区别。

2.2 协议中数据包的封装与解封装过程

传输过程中,都会对所发送的数据添加一个首部,在这个首部中添加了必要的信息。

封装过程:

image.png

解封装过程:

image.png

数据从A发送到B,就会经历封装与解封装过程,然后得到真正要传输的数据。

二、传输层(TCP/IP)

从网络模型中看出,传输层主要的协议就是TCP和UDP协议,平常在面试的过程中也是被问道最多的问题

2.1 TCP

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

TCP协议是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。

2.1.1 特点

1 面向连接

面向连接,是指发送数据之前必须在两端建立连接。建立连接的方法是“三次握手”,这样能建立可靠的连接。建立连接,是为数据的可靠传输打下了基础。

2 仅支持单播传输

每条TCP传输连接只能有两个端点,只能进行点对点的数据传输,不支持多播和广播传输方式。

3 面向字节流

TCP不像UDP一样那样一个个报文独立地传输,而是在不保留报文边界的情况下以字节流方式进行传输。

4 可靠传输

对于可靠传输,判断丢包,误码靠的是TCP的段编号以及确认号。TCP为了保证报文传输的可靠,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。

5 提供拥塞控制

当网络出现拥塞的时候,TCP能够减小向网络注入数据的速率和数量,缓解拥塞

2.1.2 报文格式

wKioL1c4NeGixj1sAAAW153zunI355.webp

源端口号(Source Port) :标识着发送端是从上一层应用层的哪一个应用程序端口接收下来的信息,是16位大小;

目的端口号(Destination Port) :标识着要上交给目的主机上应用层的哪一个应用进程,为16位;和MAC帧协议一样其中有帧类型标识表明要上交给上一层的哪一方,IP数据报中有协议类型决定上交的对象是UDP还是TCP类型;

32位序号(Sequence Number) :在一个TCP连接中传送的字节流中的每一个字节都按照顺序编号的,一个字节占用一个序号, 因此首部信息中的序号表示本报文中所发送的数据的第一个字节的序号;

32位的确认序号(Acknowledgment Number) :表示希望收到对方下一个报文的第一个数据字节的序号,也表示在确认序号之前发送 方发送的序号标识的字节已全部收到;

数据偏移(Data Offset) :4位,表示报文中首部所占用的长度,也就是从报文开始部分往后偏移多少为有效数据的开始,也是数据距离报文首部有多远;

保留(Reserved) :为以后保留空余以供使用,目前置为0;

URG(urgent) :紧急字段,当被置为1时,表明后面的紧急指针有效;

ACK(acknowlegment) :确认字段,当被置为1时,前面的确认序号才有效;

PSH(push) :推送字段,当置为1时,用于及时将收到的报文向上交付处理;

RST(reset) :复位字段,当置为1时,表中TCP链接出现严重差错,不许释放连接然后再重新建立;

SYN(synchronization) :同步字段,当被置为1时,表明这是一个连接请求报文;

FIN(finish) :终止字段,当被置为1时,表示没有数据需要发送了(在关闭TCP连接的时候使用);

窗口(Window) :指的是自身能接收的最大数据量,是发送本报文段的接收窗口,而不是发送窗口;

检验和(Checksum) :进行差错检验,占2个字节,16位;

紧急指针(Urgent Pointers) :当URG=1时才有效,它指出报文中的紧急数据的字节数,优先处理紧急数据,16位;

选项: 长度可变,最长可达40字节;

填充: 当报文低于46个字节时用来填充;

2.1.3 建立连接(三次握手)

客户端和服务端建立连接,使之能够正常通信

image.png

“3次握手”的作用就是双方都能明确自己和对方的收、发能力是正常的。

(1)第1次握手:客户端生成一个随机数 seq,假设其值为 n,并将标志位 SYN 设为 1,将这些数据打包发给服务器端后,客户端处于SYN_SENT(同步已发送) 状态。即进入等待服务器端确认的状态。 (2)第2次握手:服务器端收到客户端发来的 SYN=1 的数据包后,知道这是在请求建立连接,于是服务器端将 SYN 与 ACK 均置为1,并将请求包中客户端发来的随机数n加 1 后赋值给 ack,然后生成一个服务器端的随机数 seq=k,完成这些操作后,服务器端将这些数据打包再发回给客户端,作为对客户端建立连接请求的确认应答。这是服务端处于SYN_RCVD(同步并且收到) 状态 (3)第三次握手:客户端收到服务器端的确认应答后,检查数据包中 ack 的字段值是否为 n+1,ACK 是否等于 1,若都正确就将服务器端发来的随机数加 1(ack=k+1),将 ACK=1 的数据包再发送给服务器端以确认服务器端的应答,服务器端收到应答包后通过检查 ack 是否等于 k+1 来确认连接是否建立成功。

为什么不是两次?

主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。

如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络节点中滞留的时间太长了,由于 TCP 的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费

为什么不是四次?

三次握手就可以确认双方的发送和接收的能力,三次握手是最佳的次数。

如果是四次五次握手根本就没有必要,总有最后的依次确认应答是不可靠的;

2.1.4 连接终止(四次挥手)

image.png

当用户关闭标签页或请求完成后,TCP 连接会进行“四次挥手”断开连接,具体过程如下详解:

  1. 客户端要断开连接,客户端先向服务器端发送 FIN=1(序号为上一次自己发送数据的最后一个字节的序号加1) 的指令,随后进入完成等待状态 FIN_WAIT_1,表明客户端已经没有再向服务器端发送的数据,但若服务器端此时还有未完成的数据传递,可继续传递数据。

  2. 服务端收到客户端 FIN 释放报文段后即发出 ACK 确认报文

    1. 务端进入 CLOSE-WAIT 关闭等待状态,此时的TCP处于半关闭状态。把 未发送数据 传输完毕
    2. 客户端接收到了服务端的 ACK 确认报文,变成了FIN-WAIT2状态。
  3. 当服务器端确认已完成所有数据传递后,便发送带有 FIN=1 的报文给客户端,准备关闭连接。服务端进入 LAST-ACK 状态

  4. 客户端收到服务端 FIN 释放报文后,发送 ACK 确认报文给服务端。自己进入TIME-WAIT状态,客户端等 2 个 MSL(Maximum Segment Lifetime,报文最大生存时间), 在这段时间内如果客户端没有收到服务端的重发请求,那么表示 ACK 确认报文成功到达服务端,挥手结束,否则客户端重发 ACK 确认报文

为什么是四次?

最主要原因是:等待服务端将剩下的报文发送完毕。

而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。

客户端为什么要等待规定的2MSL时间后才能进入CLOSED状态?

为了保证客户端发送的ACK确认报文能够到达服务端

当服务器端向客户端发送了请求断开连接的报文而没有收到响应,如果客户端并不等待时间就直接进入CLOSED状态释放了连接,那么服务器端就无法接收到客户端的确认报文,也就一直无法进入CLOSED状态了;因此,当客户端发送给服务器端的确认ACK报文丢失了时,服务器端等待超时就会重新发送一次请求断开连接的FIN报文,这样客户端在等待的2MSL时间里就会重新接收到服务器端发送的FIN请求断开报文,也就会重新发送一次ACK确认断开连接报文,这样一来,就能够保证服务器端收到了确认断开连接报文正确进入CLOSED状态了。

如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP 还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

2.2 UDP

用户数据报协议(UDP,User Datagram Protocol)是一种无连接的传输协议。。

2.2.1 特点

1 面向无连接

首先 UDP 是不需要和 TCP一样在发送数据前进行三次握手建立连接的,想发数据就可以开始发送了。并且也只是数据报文的搬运工,不会对数据报文进行任何拆分和拼接操作。

具体来说就是:

在发送端,应用层将数据传递给传输层的 UDP 协议,UDP 只会给数据增加一个 UDP 头标识下是 UDP 协议,然后就传递给网络层了在接收端,网络层将数据传递给传输层,UDP 只去除 IP 报文头就传递给应用层,不会任何拼接操作

2 有单播,多播,广播功能

UDP 不止支持一对一的传输方式,同样支持一对多,多对多,多对一的方式,也就是说 UDP 提供了单播,多播,广播的功能

3 面向报文

发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。因此,应用程序必须选择合适大小的报文

4 不可靠

首先不可靠性体现在无连接上,通信都不需要建立连接,想发就发,这样的情况肯定不可靠

并且收到什么数据就传递什么数据,并且也不会备份数据,发送数据也不会关心对方是否已经正确接收到数据了。

再者网络环境时好时坏,但是 UDP 因为没有拥塞控制,一直会以恒定的速度发送数据。即使网络条件不好,也不会对发送速率进行调整。这样实现的弊端就是在网络条件不好的情况下可能会导致丢包,但是优点也很明显,在某些实时性要求高的场景(比如电话会议)就需要使用 UDP 而不是 TCP。

5 头部开销小,传输数据报文时是很高效的。

2.2.2 报文格式

image.png

源端口:这个字段占据 UDP 报文头的前 16 位,通常包含发送数据报的应用程序所使用的 UDP 端口。接收端的应用程序利用这个字段的值作为发送响应的目的地址。这个字段是可选的,所以发送端的应用程序不一定会把自己的端口号写入该字段中。如果不写入端口号,则把这个字段设置为 0。这样,接收端的应用程序就不能发送响应了。

目的端口:接收端计算机上 UDP 软件使用的端口,占据 16 位。

长度:该字段占据 16 位,表示 UDP 数据报长度,包含 UDP 报文头和 UDP 数据长度。因为 UDP 报文头长度是 8 个字节,所以这个值最小为 8。

校验值:该字段占据 16 位,可以检验数据在传输过程中是否被损坏。

2.3 协议对比

UDPTCP
有无连接无连接面向连接
是否可靠不可靠传输,不对数据报进行检查与修改,无须等待对方的应答可靠传输,确保传输数据的正确性,不出现丢失或乱序
连接对象个数支持一对一,一对多,多对一和多对多交互通信只能一对一通信
传输方式面向报文面向字节流
首部开销首部开销小,仅8字节首部最小20字,最大60字节
使用场景适用于实时应用(ip电话,视频会议,直播等)适用于要求可靠传输的应用,例如文件传输
  • TCP 是面向连接的、可靠的、有序的、速度慢的协议;UDP 是无连接的、不可靠的、无序的、速度快的协议。
  • TCP 开销比 UDP 大,TCP 头部需要 20 字节,UDP 头部只要 8 个字节。
  • TCP 无界有拥塞控制,UDP 有界无拥塞控制。

三 、网络层

网络层中,我们可以看到常见的IP协议,接下来我们主要讲下IP协议

3.1 IP协议

IP指网际互连协议,Internet Protocol的缩写,是TCP/IP体系中的网络层协议。

IP是整个TCP/IP协议族的核心,也是构成互联网的基础。IP位于TCP/IP模型的网络层(相当于OSI模型的网络层),它可以向传输层提供各种协议的信息,例如TCP、UDP等;对下可将IP信息包放到链路层,通过以太网、令牌环网络等各种技术来传送。

3.2 协议的格式

image.png

版本(Version) (4位):该字段定义IP协议版本,一般取值为 0100(IPv4)和 0110(IPv6)。目前使用最广泛的IP协议版本号为 IPv4

头部长度(Header Length) (4位)该字段定义数据报协议头长度,表示协议头部具有32位字长的数量。协议头最小值为5,最大值为15。

服务类型(Type of Service,TOS) (8位):该字段定义上层协议对处理当前数据报所期望的服务质量,并对数据报按照重要性级别进行分配。可用 PPP、D、T、R、C、0 这 8 个字符来表示,其中,PPP定义了数据报的优先级,取值越大表示数据越重要,取值如下表所示。

ppp 取值含 义
000普通(Routine)
001优先(Priority)
010立即(Immediate)
011闪速(Flash)
100疾速(Flash Override)
101关键(Critic)
110网间控制(Internetwork Control)
111网络控制(Network Control)
  • D:时延,0 表示普通,1表示延迟尽量小;
  • T:吞吐量,0 表示普通,1表示流量尽量大;
  • R:可靠性,0 表示普通,1表示可靠性尽量大;
  • C:传输成本,0 表示普通,1表示成本尽量小;
  • 0:这是最后一位,被保留,恒定为 0

总长度(16位):该字段定义整个IP数据报的字节长度,包括协议头部和数据。其最大值为65535字节。

标识(16位):该字段包含一个整数,用于识别当前数据报。当数据报分段时,标识字段的值被复制到所有的分段之中。该字段由发送端分配帮助接收端集中数据报分段。

标志(Flags) (3位):

  • 第1位不使用,保留,值为0
  • 第2位,分段,有2个不同的取值,该位置0,表示可以分段;该位置1,表示不能分段;
  • 第3位,更多分段。该位置0,表示这是数据流中的最后一个分段,该位置1,表示数据流未完,后续还有

片偏移(13位):该字段的含义是某个分片在原 IP 数据报中的相对位置。第一个分片的偏移量为 0。片偏移以 8 个字节为偏移单位。这样,每个分片的长度一定是 8 字节(64 位)的整数倍。该字段占 13 bit。

生存时间(TTL,Time to Live,也称存活时间) (8位):表示数据报到达目标地址之前的路由跳数。TTL 是由发送端主机设置的一个计数器,每经过一个路由节点就减 1,减到为 0 时,路由就丢弃该数据报,向源端发送 ICMP 差错报文。这个字段的主要作用是防止数据报不断在 IP 互联网络上循环转发。该字段占 8 bit。

协议(8位):该字段用来标识数据部分所使用的协议,比如取值1表示 ICMP、取值 2 表示 IGMP、取值 6 表示 TCP、取值 17 表示 UDP、取值 88 表示 IGRP、取值 89 表示 OSPF。该字段占 8 bit。

头部校验和(Header Checksum) 16位):该字段帮助确保IP协议头的完整性 由于某些协议头字段的改变,这就需要对每个点重新计算和检验。计算过程是先将校验和字段置为0,然后将整个头部每16位划分为一部分,将个部分相加,再将计算结果取反码,插入到校验和字段中。

起源和目标地址(32位和32位):用于标识这个 IP 数据报的起源和目标 IP 地址。值得注意的是,除非使用 NAT(网络地址转换),否则整个传输的过程中,这两个地址不会改变。这两个地段都占用 32 bit。

选项(可选) :这是一个可变长的字段。该字段属于可选项,主要是给一些特殊的情况使用,最大长度是 40 字节。

填充(Padding) :由于 IP 报头长度这个字段的单位为 32 bit,所以 IP 报头的长度必须为 32bit 的整数倍。因此,在可选项后面,IP 协议会填充若干个 0,以达到 32bit 的整数倍。

3.3 IP 地址的分类

IP地址由IP协议所提供的一种统一的地址格式,每一个网络和主机都会有一个逻辑地址,在交换数据时,它用于防止网络上的通信发生错误。IP地址由两部分组成,即网络地址和主机地址。

image.png 根据网络号和主机号来分,IP地址一般可以分为分为A、B、C三类常规地址及D、E两类特殊地址。

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

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

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

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

E类:IP地址范围为240.0.0.0 - 255.255.255.255此类为保留地址,留待特殊用途