![TCP 服务器和客户端在哪些详细步骤会消耗资源?](https://linux22.com/image/1594290/TCP%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%92%8C%E5%AE%A2%E6%88%B7%E7%AB%AF%E5%9C%A8%E5%93%AA%E4%BA%9B%E8%AF%A6%E7%BB%86%E6%AD%A5%E9%AA%A4%E4%BC%9A%E6%B6%88%E8%80%97%E8%B5%84%E6%BA%90%EF%BC%9F.png)
答案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)