UNIX学习之路 一步一个脚印之TCP连接的建立和终止

如果我们把TCP连接看做是打电话 那么 socket函数等同于有电话可以用。Bind用于告诉其他人你的电话号码,让他们可以向你打电话。Listen是打开打开电话的振铃,它使你可以听到一个外来电话。Connect要求你知道另一方的电话号码并拨打它。Accept是被呼叫回电话

建立一个TCP连接 过程至少需要三个交换三个分组,因此称之为TCP三路握手 下面说下详细步骤:

1.服务器必须准备好接受外来的连接。这通过调用socketbindlisten函数来完成,称为被动打开(passive open)。

2.客户通过调用connect进行主动打开(active open)。这引起客户TCP发送一个SYN分节(表示同步),它告诉服务器客户将在(待建立的)连接中发送的数据的初始序列号。一般情况下SYN分节不携带数据,它只含有一个IP头部,一个TCP头部及可能有的TCP选项(下面介绍)。

3.服务器必须确认客户的SYN,同时自己也得发送一个SYN分节,它含有服务器将在同一连接中发送的数据的初始序列号。服务器以单个分节向客户发送SYN和对客户SYNACK

4.客户必须确认服务器的SYN

每一个SYN可以含有若干个TCP选项 一般常用的有下面几种:

MSS选项:TCP发送的SYN中带有这个选项是通知对方它的最大分节大小MSSmaximum segment size),即它能接受的每个TCP分节中的最大数据量(使用TCP_MAXSEG套接口选项获取与设置这个TCP选项)。

窗口规模选项:TCP双方能够通知对方的最大窗口大小是65535,因为TCP头部相应的字段只占16位。

时间戳选项:这个选项对高速连接是必要的,它可以防止失而复得的分组可能造成的数据损坏



TCP用三个分节建立一个连接,终止一个连接则(一般)需要四个分节。

因为每个方向都需要有一个FIN和一个ACK,所以一般需要四个分节。我们使用限定词“一般”是因为有时候步骤1FIN会随数据一起发送;另外,执行被动关闭那一端的TCP在步骤23发出的ACKFIN也可以合并成一个分节

1.某个应用程序进程首先调用close,我们称这一端执行主动关闭(active close)。这一端的TCP于是发送一个FIN分节,表示数据发送完毕。

2.接收到FIN的另一端执行被动关闭(passive close)。这个FINTCP确认。它的接收也作为文件结束符传递给接收方应用进程(放在已排队等候该应用进程接收的任何其他数据之后),因为FIN的接收意味着应用进程在相应连接上再也接收不到额外数据。

3.一段时间后,接收到文件结束符的应用进程将调用close关闭它的套接口。这导致它的TCP也发送一个FIN

4.接收到这个FIN的原发送方TCP(即执行主动关闭的那一端)对它进行确认。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值