Crab213's Blog.

TCP/IP详解阅读笔记2:TCP连接管理

2016/03/18

TCP连接建立

TCP与UDP不同,是基于连接的协议,而UDP是俗称的数据报协议。TCP最大的不同是有连接,是有内部状态的协议。为了建立正确的连接,需要特定机制确定连接的参数及其状态。这些状态中最基本的包括连接双方的序列数(sequence number),窗口大小,以及双方能够接受的最大段长度(maximum segment size, MMS)。因此建立一个TCP连接需要进行一些约定好的步骤,也就是俗称的“三次握手”。

第一次握手

TCP连接需要一个发起人,成为客户端(client),响应的另一方称之为服务端(server)。发起连接时,客户端向服务端发送一个SYN段(就是TCP头中FLAGS中SYN位设为一的段)。SYN是synchronization的简写,意为“同步”。客户端发送的这个SYN段中的序列数被称作初始序列数(ISN, initial sequence number),服务端得到此消息之后,就知道了客户端发送的第一个段的序列数,以此作为基准来发送确认信息(ACK)。同时这个段中可以包含更多的选项,以此通知服务段某些额外信息。

第二次握手

同样,服务端也会回应客户端一个SYN段。这个SYN段包含了对客户端发给它的SYN段的响应(ACK为客户端SYN段的序列数+1),表示服务端收到了客户端发送的SYN段。同时,服务端也在这个SYN段设置了自己的初始序列数。

第三次握手

客户端此时需要回应一个确认信息(ACK)表示它收到了服务端发送的SYN段,至此TCP连接建立成功。

TCP连接关闭

TCP关闭的机制与TCP连接建立的机制差不多,只不过SYN段变成了FIN段,就是FALGS中FIN段被设置成为1的段。网上俗称“四次挥手”。

第一次挥手

主动关闭方给对面发送一个FIN段。

第二次挥手

被动关闭方给主动关闭方一个ACK表示收到FIN段。

第三次挥手

由于被动关闭方收到FIN段,协议实现会通知上面的应用层对面关闭了连接。一般情况下应用程序也会关闭自己这边的连接,也就是说被动关闭方自己会发送自己的FIN段,通知对面自己也要关闭这个连接(TCP协议允许半开的连接)。

第四次挥手

主动关闭方再次回给被动关闭方一个ACK。

初始序列数(ISN)

初始序列数是一个随机设置的数字, 长度为32位。为了兼顾安全性,这个数字需要尽可能的无法被猜出来。由于网络的开放性,如果有人能够猜出这个数次的大概范围,那么就可一构造一个虚假的TCP段,将IP地址及端口号伪造后,直接设置FIN段,就可以打断一个TCP连接。这个数需要在每次新建TCP连接的时候重新设置,假若有一个TCP连接被一方单方面中断后重新连接时,ISN没有重新设置,那么另一方就会将这个ISN用作原来传输的数据之中,导致数据损坏。

TCP选项

TCP选项是在TCP头后面附加的选项值,除了NOP和EOL(End of Option List)外,格式统一,为一字节类型值,一字节选项长度值,跟上选项自带的内容。

最大段长度(MMS, maximum segment size)

最大段长度是TCP允许接受的数据的最大值(不包括TCP头)。每当连接建立的时候,通过在SYN段设置MMS。此选项通过一个十六位的值表示MMS。

窗口尺寸(Window Scale, WSCALE or WSOPT)

由于MMS只能用16位二进制数表示,这限制了TCP的传输速率。窗口尺寸可以设置这个16位二进制数的乘积因子。这一字节的乘积因子范围为1到14,会使MMS的16位二进制数左移1到14位,可以使MMS的数值扩大到大约1GB。

CATALOG
  1. 1. TCP连接建立
    1. 1.0.0.1. 第一次握手
    2. 1.0.0.2. 第二次握手
    3. 1.0.0.3. 第三次握手
  • 2. TCP连接关闭
    1. 2.0.0.1. 第一次挥手
    2. 2.0.0.2. 第二次挥手
    3. 2.0.0.3. 第三次挥手
    4. 2.0.0.4. 第四次挥手
  • 3. 初始序列数(ISN)
  • 4. TCP选项
    1. 4.0.0.1. 最大段长度(MMS, maximum segment size)
    2. 4.0.0.2. 窗口尺寸(Window Scale, WSCALE or WSOPT)