专栏首页阿伟的个人博客Tcp连接建立与连接释放

Tcp连接建立与连接释放

Tcp连接建立

上图为Tcp连接建立过程:

1)客户端给服务器发送了一条将其SYN标志位置1的请求连接建立报文,然后其状态由closed转变为SYN-SENT(同步已发送)。

2)服务器收到该报文后如果想要与客户端建立连接其给客户端发送一条将ACK和SYN都置1的报文。此时服务器的状态由的listed状态转化为SYN-RECV(同步已接收)状态。

3)客户端收到该报文后,给服务器发送一条将ACK置为1的确认报文,之后就进入established状态(已建立连接)。

4)服务器收到上述报文后也进入established状态,之后就可以你来我往的通信了。

客户端:
fd = socket()  
// 调用该方法时由closed转化为syn-sent,该方法是一个阻塞方法,当获得返回值时转回established状态
connect(fd, address+port) 
服务器:
fd = socket();
bind();
listed(); // 进入listen状态
// 对于阻塞socket,调用accept()之前进入SYN-RECV 当前获得返回值后进入established状态。
accept(); 

Tcp连接释放

连接释放过程如上图所示.

1)客户端对服务器发送连接释放报文段将其FIN标志位置1,并由之前的established状态转化为finwait-1(终止等待1)状态。此时其已经不能再发送了,只能接收。

2)服务器收到连接释放报文后,对客户端发送一条将ACK置1的响应报文,并转化为closewait(关闭等待)状态,之后其继续可以向客户端发送信息。

3)客户端收到该报文后,转化为finwait-2(终止等待2)状态。

4)当服务器信息也发送完了,其会给客户端发送一天将FIN和ACK都置为1的报文,自己进入lastack状态(最后一个应答)。

5)客户端收到最后一条应答报文后将对服务器发送一条应答报文ACK=1,并进入timewait(时间等待)状态,并在timewait状态等待两个MSL后再将自己关闭。

6)服务器端收到应答报文后关闭该连接。

客户端:
close()
服务器:
// 返回0
read()
close()

为何要等待两个MSL?

1)为了保证客户端的最后一条应答报文到达服务器,当该报文丢失后,服务器端会在2msl时间之内重传一条FIN=1,ACK=1报文,客户端收到后会重发一条应答报文,并将等待计时器清0重新计时。如此是为了避免客户端自己关了,服务器端的就无法收到最后一个ACK=1报文,无法按照正常步骤进入closed状态。

2)为了防止已失效的连接请求报文出现在本连接中。

document.querySelectorAll('.github-emoji') .forEach(el => { if (!el.dataset.src) { return; } const img = document.createElement('img'); img.style = 'display:none !important;'; img.src = el.dataset.src; img.addEventListener('error', () => { img.remove(); el.style.color = 'inherit'; el.style.backgroundImage = 'none'; el.style.background = 'none'; }); img.addEventListener('load', () => { img.remove(); }); document.body.appendChild(img); });

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 不同的二叉搜索树

    对于二叉树问题的一般解决思路为将该树分为根结点,左子树,右子树,然后再对左右子树各个击破,最终将信息返回到根结点。

    你的益达
  • 除数博弈

    选出任一 x,满足 0 < x < N 且 N % x == 0 。 用 N - x 替换黑板上的数字 N 。 如果玩家无法执行这些操作,就会输掉游戏。

    你的益达
  • 自由之路

    视频游戏“辐射4”中,任务“通向自由”要求玩家到达名为“Freedom Trail Ring”的金属表盘,并使用表盘拼写特定关键词才能开门。

    你的益达
  • TCP连接及其优化

    作为一个后端程序员,网络连接这块是一个绕不过的砍,当你在做服务器优化的时候,网络优化也是其中一环,那么作为网络连接中最基础的部分- TCP连接你了解吗?今天我们...

    健程之道
  • Service Worker 全面进阶

    Service Worder 是用来代替 manifest,用来生成缓存的效果的。以前吭哧吭哧的学 manifest 的时候,就发现 MD 好难用。Servic...

    腾讯IVWEB团队
  • TCP/IP(五)传输层之细说TCP的三次握手和四次挥手

    前言   这一篇我将介绍的是大家面试经常被会问到的,三次握手四次挥手的过程。以前我听到这个是什么意思呀?听的我一脸蒙逼,但是学习之后就原来就那么回事! 一、运输...

    用户1195962
  • 计算机网络基础知识点快速复习手册

    在向下的过程中,需要添加下层协议所需要的首部或者尾部,而在向上的过程中不断拆开首部和尾部。

    后端技术漫谈
  • 解决.htaccess: Invalid command ‘RewriteEngine’,问题

    今天首先是网站打不开,显示的是服务器apache内部错误.500.说让检查一下服务器错误日志.

    十四君
  • 计算机网络基础知识点快速复习手册

    在向下的过程中,需要添加下层协议所需要的首部或者尾部,而在向上的过程中不断拆开首部和尾部。

    Rude3Knife的公众号
  • Functrace:使用DynamoRIO追踪函数调用

    Functrace是一款使用DynamoRIO(http://dynamorio.org/)通过动态检测分析二进制文件的工具。

    FB客服

扫码关注云+社区

领取腾讯云代金券