答案1
握手开始时,两台主机都会消耗一些内存来跟踪半开连接。但是,在程序初始化代表连接的“套接字”时,客户端也会额外消耗一些内存,甚至在发送任何数据包之前。
同样,一旦服务器收到 SYN 数据包,它就会分配一些内存来跟踪连接的参数。
发送大量 SYN 来耗尽服务器资源实际上是一种常见的攻击,称为SYN洪水。为了应对这种情况,一些服务器有一个“SYN-cookie”模式,没有发送 SYN+ACK 响应后保持资源分配;它可以丢弃该信息,直到客户端的 ACK 到达,此时服务器开始正常跟踪连接。
从编程的角度来看,整个握手在一个步骤中完成。但是,当你编写客户端时,表示该连接的变量会被赋值前要求操作系统执行握手。
conn = socket(AF_INET, SOCK_STREAM)
# The variable representing the "socket" is initialized and some memory is
# allocated, but no connection is done yet
connect(conn, address)
# The entire TCP handshake is performed during connect()
编写服务器时则相反。首先设置“监听”套接字,但每个单独的接收连接都首先由操作系统接受(执行握手),然后才提供给程序。
conn = accept(listener)