TCP套接字状态转换

TCP套接字三次握手示意图

TCP套接字撒每次握手示意图
上图简单表达了客户端与服务端建立TCP链接的三次握手过程,如图所示,在建立TCP连接的过程中一般会发生如下情形:
1.服务器准备好接受外来的连接请求,Linux系统下一般会通过调用socket、bind和listen来完成这部分工作,称之为被动打开(passive open)。
2.客户端通过调用connect发起连接请求,称之为主动打开(active open)。这会使得客户端向服务端发送一个SYN分节,它告知服务器客户端将在连接中发送的数据的初始序列号。通常SYN分节不携带数据,其所在的ip数据报只包含一个IP头、TCP头以及可能的TCP选项。
3.服务确认客户端的SYN,同时自己也发送一个SYN分节,它含有服务器将在同一连接中发送数据的初始序列号,服务器在单个分节中发送ACK以及SYN。
4.客户端必须确认服务端的SYN,向服务端在发送一次ACK分节。

在以上的过程中伴随着TCP套接字状态的转换,上图已经标出相应的动作后TCP状态的转换。

TCP套接字四次挥手示意图

TCP套接字四次挥手示意图上图简单表示了TCP套接字四次挥手过程,在断开连接的过程中一般会发生如下情形:
1.某个应用进程(客户端进程)首先调用close,称之为主动关闭(active close),该端的TCP发送一个FIN分节,表示数据发送完毕。
2.接受到FIN的对端(服务端进程)执行被动关闭(passive close),这个FIN由TCP确认,它的接收也作为一个文件结束符(EOF)传递给应用进程(放在排队等候应用进程接收的任何其他数据之后),因为FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
3.一段时间后,接收到文件结束符的服务进程将调用close关闭它的套接字,这会引发被动关闭端(服务进程)也会向主动关闭端(客户端进程)发送一个FIN分节。
4.主动关闭端确认这个FIN。
如此看来一般会需要4个分节来完成断开TCP连接的操作,但存在一些可能的情况:步骤1的FIN随着数据一起发送? 步骤2和步骤3也可以合并在一个分节中。这个过程中伴随着套接字状态的一些转换,上图已经标出相应的动作后TCP状态的转换。

在步骤2与步骤3之间产生一些数据流动是有可能的,不过只能从被动关闭端流向主动关闭端,这称为半关闭(half-close)。与之相关的是shuntdown函数。

上图展示了客户端执行主动关闭的场景,不过有些时候服务端会是执行主动关闭的一方,例如一些web服务。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值