TCP的三路握手建立连接与四次挥手终止连接

学习网络总会遇到三路握手用来建立TCP连接,四次挥手用来终止TCP连接这个小问题。

1.三路握手

建立一个TCP连接时,需要经历以下三个情形
服务器必须做好接受外来的连接。这通常通过socket,bind,listen函数完成,称之为”被动打开”
客户通过调用connect发起”主动打开”。

(1)上述行为就导致了,客户TCP发送SYN(同步序列号)分节,告诉服务器客户这边将在待建立的连接上发送数据的初始序列号。(通常SYN不携带数据,它所在的IP数据报只含有一个IP首部,一个TCP首部,可能有的TCP选项)
(2)服务器看到了客户向它发来的SYN,就给客户那边发送一个ACK(确认字段),同时也将自己的SYN分节发给客户,这个SYN含有服务器将在同一连接中发送数据的初始序列号。也就是说,这一步服务器给客户发送了SYN和ACK确认。
(3)客户看到服务器给它发送的SYN,也得回复一个ACK确认。

图解:
这里写图片描述

**补充TCP选项**
1.MSS选项(maximum segment size),发送SYN的TCP一端使用这个选项告诉对端自己最大分节大小,也就是它在本次连接中TCP分节所能接受的最大数据量,发送端TCP使用接收端的MSS值作为发送TCP分节的最大大小。使用TCP_MAXSEG套接字选项提取和设置MSS选项。
2.窗口规模选项
这里写图片描述
这里写图片描述
由上图可见,TCP首部中窗口大小位16字节,也就是65535,所以TCP连接任何一端能告知对端最大的窗口大小也就是65535.but现在高速网络连接在45Mbit/s甚至更快,卫星链路要求更大的窗口以尽可能获得更大的吞吐量。这个新选项能做的就是指定TCP窗口大小必须扩大(即向左移位(0~14)),所以就将窗口大小扩大至接近65535*2^14,近1G.不过前提是两端系统必须都支持这个选项。使用SO_RCVBUF套接字选项影响这个TCP选项。

为提供与不支持这一选项的较早实现间的互操作性,需要有如下规则,TCP作为主动打开的部分内容岁随它的SYN发送该选项,如果对端也随它的SYN发送该选项,它才能扩大自己窗口的大小。即服务器的TCP只有接收到随客户的SYN到达的该选项时,才能发送”窗口规模选项”。

3.时间戳选项。这个选项对于高速网络连接是必要的,它可以防止失而复现的分组可能造成的数据损坏。这个选项与窗口规模选项类似,以协商的方式处理。

“窗口规模选项”“时间戳选项”也称为”长胖管道选项”,因为高带宽或长延迟的网络被称为”long fat pipe”

2.四次挥手

终止一个连接”通常”需要4个分节
以客户端主动关闭为例

(1)客户端调用close关闭它的套接字,执行”主动关闭”。它发送一个FIN分节给”被动关闭”的一方,即服务器,表示发送数据完毕。客户端由ESTABLISHED状态进入FIN_WAIT_1状态。
(2)服务器接收客户端的FIN,执行被动关闭,并发送ACK,服务器由ESTABLISHED状态进入CLOSE_WAIT状态,客户端接收ACK,进入FIN_WAIT_2状态
(3)过了一段时间,服务器调用close关闭它的套接字,发送FIN。
(4)客户端接收服务器端的FIN,发送一个ACK,进入TIME_WAIT状态,服务器接收ACK,两者随后都进入了真实的起始点CLOSED状态
为什么”通常是4个分节”,由其他状况吗?
某些情形下步骤1的FIN随数据一起发送,另外,步骤2和3发送的分节都出自执行被动关闭的一端,有可能合并成一个分节
图解:
以客户端主动关闭为例
类似SYN,一个FIN占据1个字节,因此,每个FIN的ACK确认号就是FIN的序列号+1
这里写图片描述
为了更好的理解三路握手,方便理解四次挥手,TCP连接建立与终止的过程用TCP状态转换图表示,TCP为一个连接定义了11种状态,关于他们的转换请参照UNIX网络编程第一卷图2-4
这里写图片描述

这里写图片描述


持续更新…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值