TCP连接的建立和终止

1.TCP连接的建立

        三路握手如下图所示:

建立一个TCP连接情形如下:

        (1)服务器进程必须准备好接受外来的连接。通过调用socket,bind,listen这三个函数来完成,也可以称为被动打开。

        (2)客户进程通过connect函数发起连接(可以称为主动打开),客户端TCP会发送一个SYN(建立连接)分节,这个分节告诉服务器客户在连接中发送的数据的初始序列号。通常情况下SYN分节不携带数据,其所在的IP数据报只含有一个IP首部,一个TCP首部及可能的TCP选项。

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

        (4)客户必须确认客户的SYN


         TCP选项(每个SYN可以含有多个TCP选项):

        (1)MSS选项,发送SYN的TCP一端使用本选项通告对端它的组大分节大小(即MSS),也就是它在本连接的每个TCP分节中愿意接受的最大数据量。发送端TCP使用接收端的MSS值作为发送分节的最大大小。TCP_MAXSEG套接字选项提取和设置这个TCP选项。

        (2)窗口规模选项。TCP连接任何一端能够通告对端的最大窗口大小是65535,因为在TCP首部中相应的字段占16位。然而在高速网络链接(45Mbit/s或更快)或长延迟路径(卫星链路)要求有更大的窗口以获得尽可能大的吞吐量。这个新选项指定TCP首部中的通告窗口必须扩大(即左移)的位数(0-14),因此提供的最大窗口接近1GB。在一个TCP连接上使用窗口规模的前提是它的两个端系统必须都支持这个选项。SO_RCVBUF套接字选项影响这个TCP选项。

         (3)时间戳选项。这个选项对于高速网络连接是必要的,它可以防止由失而复现的分组可能造成的数据损坏。这是一个较新的选项,也是以类似于窗口规模选项的方式协商处理。但是对于网络编程人员来说,无需考虑它。

2.TCP连接的终止

         TCP连接关闭时的分组交换如下图所示:

TCP连接关闭(4个分节)步骤:

        (1)某个应用进程首先调用close函数(称为主动关闭),该端的TCP于是发送一个FIN分节,表示数据发送完毕。

        (2)接收到这个FIN的对端执行被动关闭,这个FIN由TCP确认。它的接受也作为一个文件结束符传递给接收端应用进程(它会被放在已排队等候该应用进程接收的任何其它数据之后),因为FIN的接收意味着接收端应用进程在相应连接上再无额外数据可以接收。

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

        (4)接收这个最终FIN的原发送端TCP确认这个FIN。

         总结:每个方向都需要一个FIN和一个ACK,通常关闭一个TCP连接需要4个分节。但是某些情形下步骤1的FIN随数据一起发送;步骤2和步骤3发送的分节都出自执行被动关闭的一端,有可能被合并成一个分节。

         注意:在步骤2和步骤3之间,从执行被动关闭一端到执行主动关闭一端流动数据是有可能的,称为半关闭。在应用进程终止时(无论主动退出还是非自愿退出),所有的打开的描述符都被关闭。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值