文章目录
- 学习资源来自:扔物线
- TCP / IP 协议族
- TCP连接
- TCP 连接的建立与关闭
- TCP 连接的建立
- 为什么要三次握手?
- TCP 连接的关闭
- 为什么要四次挥手?
- 为什么要⻓连接?
- 常见面试题
- 课后题
学习资源来自:扔物线
TCP / IP 协议族
- 一系列协议所组成的一个网络分层模型
- 为什么要分层?
因为网络的不稳定性
- Application Layer 应用层:HTTP、FTP、DNS,提供了网络应用程序之间的通信机制
- Transport Layer 传输层:TCP、UDP,提供可靠的端到端的数据传输服务的层次
- Internet Layer 网络层:IP,网络中所有数据传输的入口和出口
- Link Layer 数据链路层:以太网、Wi-Fi,处理与传输媒介(如双绞线、光纤、无线电波等)的物理接口细节
TCP连接
什么叫做连接
通信双方建立确认「可以通信」,不会将对方的消息丢弃,即为「建立连接」
TCP 连接的建立与关闭
TCP 连接的建立
① 首先客户端向服务器发送一个 SYN 包,并等待服务器确认,其中:
- 标志位为 SYN,表示请求建立连接;
- 序号为 Seq = x(x 一般取随机数);
- 随后客户端进入 SYN-SENT 阶段。
② 服务器接收到客户端发来的 SYN 包后,对该包进行确认后结束 LISTEN 阶段,并返回一段 TCP 报文,其中:
- 标志位为 SYN 和 ACK,表示确认客户端的报文 Seq 序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接;
- 序号为 Seq = y;
- 确认号为 Ack = x+ 1,表示收到客户端的序号 Seq 并将其值加 1 作为自己确认号 Ack 的值,随后服务器端进入 SYN-RECV 阶段。
③ 客户端接收到发送的 SYN + ACK 包后,明确了从客户端到服务器的数据传输是正常的,从而结束 SYN-SENT 阶段。并返回最后一段报文。其中:
- 标志位为 ACK,表示确认收到服务器端同意连接的信号;
- 序号为 Seq = x + 1,表示收到服务器端的确认号 Ack,并将其值作为自己的序号值;
- 确认号为 Ack= y + 1,表示收到服务器端序号 seq,并将其值加 1 作为自己的确认号 Ack 的值。
- 随后客户端进入 ESTABLISHED。
当服务器端收到来自客户端确认收到服务器数据的报文后,得知从服务器到客户端的数据传输是正常的,从而结束 SYN-RECV 阶段,进入 ESTABLISHED 阶段,从而完成三次握手
为什么要三次握手?
检查当前这个网络的情况是否满足可靠传输的基本条件
为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
具体例子:“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。
TCP 连接的关闭
当客户端和服务器通过三次握手建立了TCP连接以后,当数据传送完毕,肯定是要断开TCP连接的啊。那对于TCP的断开连接,这里就有了神秘的“四次挥手”。
比如客户端初始化的序列号ISA=100,服务端初始化的序列号ISA=300。TCP连接成功后客户端总共发送了1000个字节的数据,服务端在客户端发FIN报文前总共回复了2000个字节的数据。
-
第一次挥手:当客户端的数据都传输完成后,客户端向服务端发出连接释放报文(当然数据没发完时也可以发送连接释放报文并停止发送数据),释放连接报文包含FIN标志位(FIN=1)、序列号seq=1101(100+1+1000,其中的1是建立连接时占的一个序列号)。需要注意的是客户端发出FIN报文段后只是不能发数据了,但是还可以正常收数据;另外FIN报文段即使不携带数据也要占据一个序列号。
-
第二次挥手:服务端收到客户端发的FIN报文后给客户端回复确认报文,确认报文包含ACK标志位(ACK=1)、确认号ack=1102(客户端FIN报文序列号1101+1)、序列号seq=2300(300+2000)。此时服务端处于关闭等待状态,而不是立马给客户端发FIN报文,这个状态还要持续一段时间,因为服务端可能还有数据没发完。
-
第三次挥手:服务端将最后数据(比如50个字节)发送完毕后就向客户端发出连接释放报文,报文包含FIN和ACK标志位(FIN=1,ACK=1)、确认号和第二次挥手一样ack=1102、序列号seq=2350(2300+50)。
-
第四次挥手:客户端收到服务端发的FIN报文后,向服务端发出确认报文,确认报文包含ACK标志位(ACK=1)、确认号ack=2351、序列号seq=1102。注意客户端发出确认报文后不是立马释放TCP连接,而是要经过2MSL(最长报文段寿命的2倍时长)后才释放TCP连接。而服务端一旦收到客户端发出的确认报文就会立马释放TCP连接,所以服务端结束TCP连接的时间要比客户端早一些。
为什么要四次挥手?
TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据;当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的;当主机2也发送了FIN报文段时,这个时候就表示主机2也没有数据要发送了,就会告诉主机1,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。
为什么要⻓连接?
因为移动网络并不在 Internet 中,而是在运营商的内网,并不具有真正的公网 IP,
因此当某个 TCP 连接在一段时间不通信之后,网关会出于网络性能考虑而关闭这条
TCP 连接和公网的连接通道,导致这个 TCP 端口不再能收到外部通信消息,即 TCP
连接被动关闭
⻓连接的实现方式
心跳。即在一定间隔时间内,使用 TCP 连接发送超短无意义消息来让网关不能将自
己定义为「空闲连接」,从而防止网关将自己的连接关闭。
常见面试题
-
为什么TCP连接的时候是3次?2次不可以吗?
因为需要考虑连接时丢包的问题,如果只握手2次,第二次握手时如果服务端发给客户端的确认报文段丢失,此时服务端已经准备好了收发数(可以理解服务端已经连接成功)据,而客户端一直没收到服务端的确认报文,所以客户端就不知道服务端是否已经准备好了(可以理解为客户端未连接成功),这种情况下客户端不会给服务端发数据,也会忽略服务端发过来的数据。如果是三次握手,即便发生丢包也不会有问题,比如如果第三次握手客户端发的确认ack报文丢失,服务端在一段时间内没有收到确认ack报文的话就会重新进行第二次握手,也就是服务端会重发SYN报文段,客户端收到重发的报文段后会再次给服务端发送确认ack报文。 -
为什么TCP连接的时候是3次,关闭的时候却是4次?
因为只有在客户端和服务端都没有数据要发送的时候才能断开TCP。而客户端发出FIN报文时只能保证客户端没有数据发了,服务端还有没有数据发客户端是不知道的。而服务端收到客户端的FIN报文后只能先回复客户端一个确认报文来告诉客户端我服务端已经收到你的FIN报文了,但我服务端还有一些数据没发完,等这些数据发完了服务端才能给客户端发FIN报文(所以不能一次性将确认报文和FIN报文发给客户端,就是这里多出来了一次)。 -
为什么客户端发出第四次挥手的确认报文后要等2MSL的时间才能释放TCP连接?
这里同样是要考虑丢包的问题,如果第四次挥手的报文丢失,服务端没收到确认ack报文就会重发第三次挥手的报文,这样报文一去一回最长时间就是2MSL,所以需要等这么长时间来确认服务端确实已经收到了
课后题
1.【单选题】TCP / IP 协议族中,HTTP 协议在哪一层?
A. 应用层
B. 传输层
C. 网络互联层
D. 数据链路层
答案: A
答案解析:HTTP(Hypertext Transfer Protocol)协议是一种应用层协议,它用于在网络中传输超文本(例如网页)。在TCP/IP协议族中,HTTP协议位于最上层,也就是应用层。
2.【单选题】TCP / IP 协议族中,TCP 协议在哪一层?
A. 应用层
B. 传输层
C. 网络互联层
D. 数据链路层
答案: B
答案解析:TCP(Transmission Control Protocol)协议是一种传输层协议,它在TCP/IP协议族中位于传输层。TCP协议负责将数据分段并提供可靠的传输,确保数据能够在网络中正确地传输到目标地址
3.【单选题】TCP / IP 协议族中,IP 协议在哪一层?
A. 应用层
B. 传输层
C. 网络互联层
D. 数据链路层
答案: C
答案解析:IP协议(Internet Protocol)是TCP/IP协议族中的核心协议之一,它位于网络互联层。IP协议负责将数据包从一个网络发送到另一个网络,确保数据的路由和传输
4.【单选题】TCP 协议的主要作用是?
A. 进行具体的网络应用交互
B. 保证网络数据的可靠传输
C. 解决在网络上传输包的问题,例如网络寻址、以包为单位发送网络数据
答案: B
答案解析:TCP(Transmission Control Protocol,传输控制协议)的主要作用是保证网络数据的可靠传输。TCP协议是一种面向连接的协议,它提供了一种可靠的、有序的和错误校验的数据传输方式。在TCP协议中,发送方和接收方之间建立连接,然后通过确认、序列号和流量控制等机制,确保数据的可靠传输。相比之下,应用层协议(如HTTP)主要负责具体的网络应用交互,而网络层协议(如IP)主要负责解决在网络上传输包的问题,例如网络寻址、以包为单位发送网络数据。因此,TCP协议的主要作用是保证网络数据的可靠传输
5.【单选题】IP 协议的主要作用是?
A. 进行具体的网络应用交互
B. 保证网络数据的可靠传输
C. 解决在网络上传输包的问题,例如网络寻址、以包为单位发送网络数据
答案: C
答案解析:IP协议是TCP/IP协议族中的核心协议之一,它负责将数据包从一个网络发送到另一个网络,确保数据的路由和传输。IP协议通过将数据分成一个个的数据包,并在每个数据包中包含源IP地址和目标IP地址,来实现数据的路由和传输。因此,IP协议的主要作用是解决在网络上传输包的问题,例如网络寻址、以包为单位发送网络数据
- 【作文题】 简述 TCP 连接建立时的「三次(三向)握手」
答案: TCP 连接建立时的 “三次握手” 是指在 TCP 协议中,建立连接时需要发送三个数据包来确认连接的建立。具体过程如下:
- SYN:首先,客户端发送一个带有 SYN(同步)标志的数据包到服务器。这个数据包中会包含一个随机生成的序列号,假设为 X。
- SYN-ACK:收到 SYN 包后,服务器会向客户端发送一个带有 SYN 和 ACK(确认)标志的数据包。这个数据包中包含两个序列号,一个是服务器自己随机生成的,假设为
Y,另一个是对客户端的确认号,这个确认号等于客户端的序列号加一,即 Y = X + 1。- ACK:最后,客户端再向服务器发送一个 ACK 数据包,其序列号等于服务器的序列号加一,即 Y = X + 2。 这样,就完成了 TCP 连接的三次握手过程,从而建立了可靠的连接。
- TCP为什么是三次握手不是两次握手?
答案: TCP协议使用三次握手是为了确保连接建立成功、确认收到数据包和对方的初始序列号以及防止已失效的连接请求报文突然又传送到了服务器1。
如果使用两次握手,在第一次握手时,客户端发送SYN数据包,服务器收到后没有发送确认报文,客户端超时后重新发送SYN数据包,此时如果网络中存在重传机制,客户端可能会接收到旧的SYN数据包,导致连接建立错误1。
- 【作文题】 简述 TCP 连接关闭时的「四次挥手」
答案: TCP 连接关闭时的 “四次挥手” 是指在 TCP 协议中,关闭连接时需要发送四个数据包来确认连接的关闭。具体过程如下:
- FIN:首先,客户端发送一个带有 FIN(结束)标志的数据包到服务器,用来关闭客户端到服务器的数据传送。
- ACK:服务器收到 FIN 后,发送一个带有 ACK(确认)标志的数据包到客户端,确认序号为收到序号加一,服务器进入 CLOSE_WAIT 状态。
- FIN:然后,服务器发送一个带有 FIN 标志的数据包到客户端,用来关闭服务器到客户端的数据传送,服务器进入 LAST_ACK 状态。
- ACK:最后,客户端收到 FIN 后,发送一个带有 ACK 标志的数据包到服务器,确认序号为收到序号加一,服务器进入 CLOSED 状态,完成四次挥手。
- 【作文题】 为什么 TCP 连接在断开时是四次挥手而不是三次?
答案: TCP 连接在断开时采用四次挥手而不是三次握手,主要是考虑到可靠性的问题
在三次握手的过程中,如果最后一个 ACK 数据包丢失,那么客户端会重新发送一个 FIN 数据包,而服务器会因为无法收到确认而进入 TIME_WAIT 状态。这种情况下,服务器会等待一段时间以确保所有的数据包都已发送完毕,然后才会关闭连接。然而,这段时间内服务器不能接受新的连接,造成了资源的浪费。
为了解决这个问题,TCP 协议采用了四次挥手的过程。在第四次挥手后,服务器可以立即释放连接,而不需要等待一段时间。这样,服务器可以更高效地利用资源,同时也减少了客户端和服务器之间的数据包数量。
因此,TCP 连接断开时采用四次挥手而不是三次握手是为了提高连接的可靠性并优化资源利用