如何将我的服务开放给用户:构建 API 接口和用户认证的实践指南| 青训营

91 阅读3分钟

服务端开放端口提供服务,需要与客户端建立连接,那么服务端是如何开放端口,实现与客户端连接的呢? 下面将讲解基于tcp的网络连接。

三次握手

一次握手:客户端发送带有同步标志位SYN的报文(并带有这条报文的序号seq=x),然后客户端进入SYN_SEND 状态,等待服务器的确认;

二次握手:服务端发送带有同步标志位SYN的确认报文(ACK是确认标志位),并且报文中还包含对一次握手报文的确认序号(x + 1)以及该报文的序号y; 然后服务端进入 SYN_RECV 状态

三次握手:客户端发送确认报文ACK,然后客户端和服务器端都进入ESTABLISHED 状态,完成TCP三次握手。

【TCP报文为每个字节数据进行了编号seg】

三次握手的目的是建立可靠的通信信道,三次握手的目的是建立可靠的通信信道,必须保证双向

其实三次握手可以拆解成像四次挥手那样,

Client发送同步报文SYN,server返回确认报文ACK client可以确保client à server发送通信正常;

Server发送同步报文SYN, client返回确认报文ACK server可以确保serveràclient发送通信正常;

显然第二步和第三步可以合并;要保证双向传输的可靠。

问题的本质是,信道不可靠,为满足“在不可靠信道上可靠地传输信息”,通信双方所需要达成的协议。(三次握手)精辟啊~!

TCP为什么不是两次握手?

  • 避免历史连接(主要原因) :如果采用两次握手,server端只要接收到syn报文就要进入连接建立状态,如果由于网络阻塞,client重传了多次同步报文,那么延迟的历史请求报文到达server端后,server也会进入连接建立状态,而client对server发来的确认报文并不理会,造成server端资源浪费;

    而三次握手,当server端发来对于历史请求的ack报文后,client会返回带有RST标志位的报文,以此终止历史连接。

  • 三次握手才可以同步双方的初始序列号:

    序列号能够保证数据包不重复、不丢弃和按序传输。如果两次握手,只能保证客户端的初始序列号ISN被同步,而不能保证服务端的初始序列号被同步。

四次挥手

第一次挥手:client发送一个带有终止标志位FIN的报文,用来关闭客户端到服务端的数据传送;

第二次挥手:server收到客户端的FIN后,发送确认报文ACK,通知应用进程该方向数据传输停止;

第三次挥手:server发送带有终止标志位的FIN报文,用来关闭服务端到客户端的数据传送;

第四次挥手:client收到服务端发送的FIN报文,之后发送确认报文ACK,之后进入TIME-WAIT时间等待状态,如果客户端经过2MSL(报文段最长寿命,一个片段在网络中的最大存活时间)一九没有收到server发来的报文,则证明服务端已经关闭连接,随之客户端关闭连接。

为什么要四次挥手?

  • TCP是全双工通信,可以双向传输数据。任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了 TCP 连接。