浅析TCP三次握手四次挥手

浅析TCP三次握手四次挥手

TCP(Transmission Control Protocal)传输控制协议,存在于TCP/IP 的第二层传输层当中,TCP是一个可靠的,面向连接的,全双工的数据传输服务。

三次握手

TCP在进行连接的时候会进行三次握手来确认建立连接是否成功。

img

①首先客户端向服务端发送一个SYN,同时客户端还会附带一个计时器,当服务器在规定时间内没有返回ACK确认时,就需要重新发送这个数据包,这正体现了TCP的可靠性。此时客户端处于SYN_SENT状态

②当服务端收到SYN标志时,会给客户端返回一个自己的SYN标志,同时,返回一个ACK确认标志,表示收到了客户端传来的SYN,此时服务器处于SYN_RECV状态。

③客户端收到服务端发来的SYN和ACK时,会发送一个ACK到服务器,以表示收到了服务器发来的SYN和ACK,此时的客户端处于ESTABLISHAED状态,待服务器收到ack后,变为ESTABLISHED状态,连接建立。

很简单吧?下面简单的解释一下SYN标志和ACK标志,我们需要对它们有些了解

SYN(同步标志)
提示连接的服务端检查序列的编号

FIN(结束标志)
用于结束一个TCP会话,但端口仍然处于开放状态,以接受后面的数据包

用知乎上某答主的话通俗的讲,三次握手就是:
第一次握手:你瞅啥
第二次握手:瞅你咋地
第三次握手:咱俩聊聊吧
TCP连接建立

四次挥手

下面再来看看TCP的四次挥手,在TCP连接将要断开的时候,会进行四次挥手,在四次挥手完毕后断开TCP连接。

img

①主动断开连接的一方发送一个FIN标志到被动关闭的一方,此时主动方的状态为FIN_WAIT_1

②被动方收到主动方发来的SYN标志时,马上发送一个ACK标志到主动方,以表示确认收到,此时的被动方处于CLOSE_WAIT状态

③随后被动方发送一个FIN标志到主动方,被动方状态变为LAST_ACK状态

④主动方收到后,发送一个ACK标志到被动方,以表示收到,此时的主动方处于TIME_WAIT状态,此时,连接会在2MSL之后关闭

需要注意的是2MSL是2倍的最大报文生存时间,为什么需要等待两倍的最大报文生存时间才关闭连接呢?

当TCP的一端发起主动关闭,在发出最后一个ACK包后,即第3次握手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,必须在此状态上停留两倍的MSL时间,等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才可继续使用。当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。不过在实际应用中可以通过设置SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TCP(传输控制协议)是一种面向连接的协议,用于在网络上可靠地传输数据。它提供了数据的可靠传输、流量控制和拥塞控制等功能,是互联网的核心协议之一。 在Node.js中,使用内置的net模块可以轻松地创建TCP服务器和客户端。下面是一个简单的TCP服务器示例: ```javascript const net = require('net'); const server = net.createServer((socket) => { console.log('client connected'); socket.on('data', (data) => { console.log(`received data: ${data}`); socket.write(`echo: ${data}`); }); socket.on('close', () => { console.log('client disconnected'); }); }); server.listen(3000, () => { console.log('server started on port 3000'); }); ``` 这个服务器会监听本地的3000端口,当有客户端连接时,会打印出“client connected”的信息。当客户端发送数据时,服务器会收到这些数据并将其打印到控制台上,然后将“echo: ”加在数据前发送回客户端。当客户端断开连接时,服务器会打印“client disconnected”的信息。 下面是一个简单的TCP客户端示例: ```javascript const net = require('net'); const client = new net.Socket(); client.connect(3000, 'localhost', () => { console.log('connected to server'); client.write('hello, server'); }); client.on('data', (data) => { console.log(`received data: ${data}`); client.destroy(); }); client.on('close', () => { console.log('disconnected from server'); }); ``` 这个客户端会连接到本地的3000端口,并发送“hello, server”的消息。当客户端收到服务器的响应时,会打印出这些数据,并断开连接。 总的来说,TCP在网络通信中扮演着非常重要的角色,Node.js内置的net模块提供了简单易用的TCP套接字接口,使得我们可以轻松地创建TCP服务器和客户端。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值