学习网络总会遇到三路握手用来建立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
持续更新…