TCP(I) 连接管理

2018-03-17  本文已影响69人  小小小超子

TCP 连接管理

查看原文

TCP 连接的建立和终止

一个 TCP 连接由一个四元组构成:源 IP、源端口、目的 IP、目的端口。一个连接通常分为三个阶段:启动、数据传输(也称“连接已建立”)、关闭。以下是建立连接是三步握手和关闭时四步挥手的过程。

image
握手:

重要的细节:对于 client 来说,第三步似乎是多余的,但是对服务端来说,是一个防止 SYN 泛洪攻击的手段:服务端在建立连接后需要为该连接分配变量和内存,如果没有第三步,恶意客户端通过不停伪造 IP 和端口发起 SYN(客户端没有太大内存消耗),导致服务端不停分配变量,最后内存消耗完崩溃。所以第三步可以让服务端辨别恶意客户端。

挥手:

挥手断开这里同样有很多重要细节:

TCP FSM

以下是 TCP 三步握手和四步挥手的有限状态机。应该掌握。

image

TCP 选项

TCP 有若干选项,每个选项的头一个字节表示“种类”,指明了选项的类型。

MSS 最大段大小选项

Max segment size。当一条 TCP 连接建立时,通信双方都要在 SYN 报文段的 MSS 选项说明自己允许的最大段大小。注意最大段大小不是双方协商的结果,而是表明自己不愿意接收任何大于该尺寸的报文段。

SACK 选择确认段

Select ACK。在滑动窗口中,TCP 采用累计 ACK 确认,不能正确的确认已经收到的但是是失序的报文段,接收方的数据队列就会出现空洞。SACK 能够使发送方了解到空洞出现并进行更有效的重传工作。通过接收 SYN 报文段中的“允许确认选项”,TCP 通信方会知道自身拥有了发布 SACK 的能力。SACK 选项由 n 个 SACK 块构成,每个 SACK 块是一对32位的序列号(a,b),表明已经接受 a 到 b 的数据。

WSOPT

Window scale option。窗口本来大小只有16位,若 wsopt 值为 s,则窗口大小为16*2^s,最大值为 1G

TSOPT

timestamp option。发送方发出的报文段带有发出时的时间戳,接收方收到后将该值写入 ACK 报文段发回给发送方。发送方据此可以精确地计算 RTT(round trip time)。同时该选项还可用于防回绕:假如存在一个过期了的报文段恰好和下一次要接受的报文段序列号相同,这时候可以通过时间戳来判断,如果该报文时间戳小于最近一次收到的报文段,说明改报文段是过期了的。

TCP 服务器选项

TCP 服务端会为每一个客户端分配一个新的进程或线程,这样负责监听的服务器就能始终准备着处理下一个到来的连接请求。但是如果服务器正在创建一个新进程(线程)时有更多的连接到来,应该如何处理?

在被用于应用程序之前,新的连接可能会有两种状态:

TCP 为这两种状态的连接准备了两个队列,可以通过限制它们的大小来管理连接。

上一篇下一篇

猜你喜欢

热点阅读