<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=SYN_cookie</id>
	<title>SYN cookie - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=SYN_cookie"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=SYN_cookie&amp;action=history"/>
	<updated>2026-07-15T00:04:00Z</updated>
	<subtitle>在这个wiki上该页的修订历史</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=SYN_cookie&amp;diff=2494913&amp;oldid=prev</id>
		<title>imported&gt;TongcyDai 来自 2025年8月19日 (二) 07:29</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=SYN_cookie&amp;diff=2494913&amp;oldid=prev"/>
		<updated>2025-08-19T07:29:01Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{NoteTA&lt;br /&gt;
|G1=IT&lt;br /&gt;
}}&lt;br /&gt;
{{expert|time=2014-12-07T04:28:47+00:00}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SYN cookie&amp;#039;&amp;#039;&amp;#039; 是一种用于阻止 [[SYN flood]] 攻击的技术。这项技术的主要发明人 [[Daniel J. Bernstein]]  将 SYN cookies 定义为“TCP 服务器进行的对开始[[传输控制协议|TCP]]数据包序列数字的特定选择”。举例来说，SYN Cookies 的应用允许服务器当 SYN 队列被填满时避免丢弃连接。相反，服务器会表现得像 SYN 队列扩大了一样。服务器会返回适当的 [[SYN+ACK]] 响应，但会丢弃 SYN 队列条目。如果服务器接收到客户端随后的ACK响应，服务器能够使用编码在 TCP 序号内的信息重构 SYN 队列条目。&lt;br /&gt;
&lt;br /&gt;
==实现==&lt;br /&gt;
发起一个 TCP 连接时，客户端将一个 TCP SYN 包发送给服务器。作为响应，服务器将 TCP SYN + ACK 包返回给客户端。此数据包中有一个[[传输控制协议#.E5.BA.8F.E5.88.97.E5.8F.B7.E5.92.8C.E7.A1.AE.E8.AE.A4|序号]]（sequence number，TCP头中的第二个32 bit），它被 TCP 用来重新组装数据流。根据 TCP 规范，由端点发送的第一个序号可以是由该端点决定的任何值。SYN Cookies 是根据以下规则构造的初始序号：&lt;br /&gt;
&lt;br /&gt;
* 令 &amp;#039;&amp;#039;&amp;#039;t&amp;#039;&amp;#039;&amp;#039; 为一个缓慢递增的时间戳（通常为 &amp;lt;code&amp;gt;[[time.h|time()]] [[位操作#逻辑移位|&amp;gt;&amp;gt;]] 6 &amp;lt;/code&amp;gt;，提供 64 秒的解析度）；&lt;br /&gt;
* 令 &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039; 为服务器会在 SYN 队列条目中存储的[[最大分段大小]]（maximum segment size，简称为 MSS）；&lt;br /&gt;
* 令 &amp;#039;&amp;#039;&amp;#039;s&amp;#039;&amp;#039;&amp;#039; 为一个加密[[散列算法|散列]]函数对服务器和客户端各自的 IP 地址和端口号以及 &amp;#039;&amp;#039;&amp;#039;t&amp;#039;&amp;#039;&amp;#039; 进行运算的结果。返回得到的数值 &amp;#039;&amp;#039;&amp;#039;s&amp;#039;&amp;#039;&amp;#039; 必须是一个24位值。&lt;br /&gt;
&lt;br /&gt;
初始 TCP 序号，也就是所谓的 &amp;#039;&amp;#039;SYN cookie&amp;#039;&amp;#039;，按照如下算法得到：&lt;br /&gt;
* 头五位：&amp;#039;&amp;#039;&amp;#039;t&amp;#039;&amp;#039;&amp;#039; [[同余|mod]] 32；&lt;br /&gt;
* 中三位：&amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039; 编码后的数值；&lt;br /&gt;
* 末24位：&amp;#039;&amp;#039;&amp;#039;s&amp;#039;&amp;#039;&amp;#039; 本身；&lt;br /&gt;
{{font|font=serif|注：由于 {{lang|en|&amp;#039;&amp;#039;m&amp;#039;&amp;#039;}} 必须用 3 位进行编码，服务器在启用了 {{lang|en|SYN Cookie}} 时只能为 {{lang|en|&amp;#039;&amp;#039;m&amp;#039;&amp;#039;}} 发送八种不同的数值。}}&lt;br /&gt;
&lt;br /&gt;
根据 TCP 规范，当客户端发回 TCP ACK 包给服务器以响应服务器的 SYN + ACK 包时，客户端必须使用由服务器发送的初始序号加1作为数据包中的{{font|font=serif|确认号}}。服务器接着从确认号中减去 1 以便还原向客户端发送的原始 SYN Cookie。&lt;br /&gt;
&lt;br /&gt;
接下来服务器进行以下检查：&lt;br /&gt;
* 根据当前的时间以及 &amp;#039;&amp;#039;&amp;#039;t&amp;#039;&amp;#039;&amp;#039; 来检查连接是否过期。&lt;br /&gt;
* 重新计算 &amp;#039;&amp;#039;&amp;#039;s&amp;#039;&amp;#039;&amp;#039; 来确认这是不是一个有效的 SYN Cookie。&lt;br /&gt;
* 从 3 位编码中解码 &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039;，以便之后用来重建 SYN 队列条目。在此之后，连接照常进行。&lt;br /&gt;
&lt;br /&gt;
==缺陷==&lt;br /&gt;
SYN Cookies 的使用不与任何协议定义冲突，照理来说它该和所有的 TCP 实现兼容。然而，当 SYN Cookies 使用的时候，会发生两种值得注意的变化：首先，服务器只能编码八种 MSS 数值，因为只有 3 位二进制空间可用。其次，这个服务器必须拒绝所有的 [[传输控制协议#TCP封包結構|TCP 选用项]]，例如大型窗口和时间戳，&amp;lt;span title=&amp;quot;because the server discards the SYN queue entry where that information would otherwise be stored.&amp;quot;&amp;gt;因为服务器会在信息被用其他方式存储时丢弃 SYN 队列条目。 &amp;lt;/span&amp;gt;&amp;lt;ref name=&amp;quot;syncookies-archive&amp;quot;&amp;gt;[http://cr.yp.to/syncookies/archive] {{Wayback|url=http://cr.yp.to/syncookies/archive |date=20090722104659 }}, cr.yp.to September 1996&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
尽管这些限制将不可避免地导致一个不如最佳的体验，它们的效果很少被客户端注意到——这些改变只在被攻击时值得注意。在这样的情况下，牺牲 TCP 选项来保护连接一般被认为是合乎情理的。 &lt;br /&gt;
&lt;br /&gt;
[[Linux内核]] 从 2.6.26 版本开始为 TCP 选用项加入了有限的支持，通过把它们编码在时间戳内实现。&amp;lt;ref name=&amp;quot;Improving Syncookies&amp;quot;&amp;gt;Patrick McManus, [http://lwn.net/Articles/277146/ Improving Syncookies] {{Wayback|url=http://lwn.net/Articles/277146/ |date=20141128000658 }}, lwn.net April 2008&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
较新的 [[TCP Cookie 传输]]（TCPCT）标准被设计用来克服 SYN Cookies 的这些问题，并且在各种方面改进这套机制。不像 SYN Cookies，TCPCT 是一个 TCP 拓展并且要求两端点都支持 TCPCT。&lt;br /&gt;
&lt;br /&gt;
==安全考量==&lt;br /&gt;
被设置为允许所有&amp;#039;&amp;#039;&amp;#039;出站&amp;#039;&amp;#039;&amp;#039;连接但对&amp;#039;&amp;#039;&amp;#039;入站&amp;#039;&amp;#039;&amp;#039;连接有限制（例如在 Web 服务器上只允许 80 端口）的简单[[防火墙]]一般是这样实现的：只阻断不必要端口的 SYN 请求。如果 SYN Cookies 被启动了，应当小心以保证攻击者不能使用伪造 ACK、尝试随机序列号的方式来绕过这样的防火墙。因此 SYN cookies 应该按照&amp;#039;&amp;#039;&amp;#039;每个端口单独处理&amp;#039;&amp;#039;&amp;#039;的方式来调节开关，这样的话一个公共端口上的 SYN Cookies 并不会在一个私有端口上被认可。&amp;lt;ref&amp;gt;{{cite web |url=http://www.iss.net/security_center/reference/vuln/linux-syncookie-bypass-filter.htm |title=存档副本 |accessdate=2013-03-17 |deadurl=yes |archiveurl=https://archive.today/20130413192449/http://www.iss.net/security_center/reference/vuln/linux-syncookie-bypass-filter.htm |archivedate=2013-04-13 }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==历史==&lt;br /&gt;
[[Daniel J. Bernstein]] 和 [[Eric Schenk]] 于 1996 年九月创造了这个技术。[[Jeff Weisberg]] 在一个月后发布了最早的实现（在 [[SunOS]] 上），[[Eric Schenk]] 随后在 1997 年二月发布了他的 [[Linux]] 实现（目前的实现使用，例如 [http://www.frozentux.net/ipsysctl-tutorial/ipsysctl-tutorial.html#AEN485 net.ipv4.tcp_syncookies]{{Wayback|url=http://www.frozentux.net/ipsysctl-tutorial/ipsysctl-tutorial.html#AEN485 |date=20150206091607 }}）。&lt;br /&gt;
&lt;br /&gt;
== 参见 ==&lt;br /&gt;
* [[TCP Cookie 传输]]&lt;br /&gt;
&lt;br /&gt;
== 参考资料 ==&lt;br /&gt;
* [http://cr.yp.to/syncookies.html D. J. Bernstein&amp;#039;s own explanation of SYN cookies]{{Wayback|url=http://cr.yp.to/syncookies.html |date=20101223201913 }}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:计算机网络安全]]&lt;br /&gt;
[[Category:TCP/IP]]&lt;/div&gt;</summary>
		<author><name>imported&gt;TongcyDai</name></author>
	</entry>
</feed>