TJU-TCP 2024 暑期计算机网络综合实践 实验过程记录
前置知识
TCP 建立连接流程图
TCP 状态图
TCP 状态解析
- CLOSED:初始状态,表示没有任何连接或者没有尝试连接,表示 TCP 连接是”关闭着的”或”未打开的”.一个新建的 TCP 连接通常会处于这个状态.
- LISTEN:表示服务器端的某个 socket 处于监听状态,等待客户端的连接请求.在服务器调用 listen()函数后,socket 就会进入这个状态.
- SYN_SENT:同步信号已经发送状态,这个状态一般是指客户端发送 SYN(建立连接的同步)数据包后所处的状态(tcp 三次握手的第一个包).在接收到远端服务器端的应答后,即从该状态进入 TCP_ESTABLISHED 状态.
- SYN_RCVD:同步信号已经接收状态,服务器端在接受到远端客户端 SYN 数据包后,进行相应的处理(创建通信套接字等),然后发送应答数据包(tcp 三次握手的第二个包),并将新创建的通信套接字状态设置为 TCP_SYN_RECEIVED,在接受到客户端的应答后,即进入 ESTABLISED 状态.
- ESTABLISHED:表示一个打开的连接,数据可以在两个方向上传输.这个状态一般是指 TCP 三次握手成功后所处的状态.
- FIN_WAIT_1:表示客户端发送了一个 FIN,请求关闭连接.在这个状态下,客户端等待服务器端的 ACK(确认)数据包.在接收到服务器端的 ACK 后,即进入 FIN_WAIT_2 状态.
- FIN_WAIT_2:表示客户端等待服务器端的 FIN,请求关闭连接.在这个状态下,客户端等待服务器端的 FIN 数据包.在接收到服务器端的 FIN 后,即进入 TIME_WAIT 状态.
- TIME_WAIT:表示等待一段时间后,如果再没有收到服务器端的 ACK,则进入 CLOSED 状态.在这个状态下,客户端等待 2MSL(最大报文存活时间)后,即进入 CLOSED 状态.
- CLOSE_WAIT:该状态存在于后关闭的一端,当接收到远端发送的 FIN 数据包后,本地发送一个 ACK 应答数据包,并进入 CLOSE_WAIT 状态.本地可以继续向远端发送数据包,在发送完所有的数据后,即进入 LAST_ACK 状态.
- CLOSING:表示双方同时发送了 FIN 数据包,请求关闭连接.在这个状态下,双方都等待对方的 ACK 数据包.在接收到对方的 ACK 后,即进入 TIME_WAIT 状态.本地发送 FIN 数据包后,如果在等待 ACK 数据包时,接收到对方的 FIN 数据包,则进入 CLOSING 状态.接收到 ACK 后,变为 CLOSE_WAIT 状态.
- LAST_ACK:后关闭的一端在发送完所有数据后,发送一个 FIN 数据包,请求关闭连接,进入 LAST_ACK 状态.在这个状态下,等待对方的 ACK 数据包.在接收到对方的 ACK 后,即进入 CLOSED 状态.
TCP 全连接和半连接队列
在 TCP 三次握手过程中, Linux 内核会维护两个队列, 分别是:
- 半连接队列
- 全连接队列
对于半连接队列, 就是 server 收到 SYN 请求后, 内核会把该连接存储到半连接队列, 并向客户端相应 SYN_ACK, 接着客户端会返回 ACK, 然后内核会把该连接从半连接队列移除, 创建新的连接, 将其添加到全连接队列中去, 等待 accept 将其取出.
任务点一:完成 TCP 连接的建立部分
三次握手
代码实现
根据三次握手的原理和框架代码,可以确定,需要修改的函数为 tju_connect, tju_connect
tju_connect
正常建立连接的时候,首先是 client 向 server 发送 SYN 包,然后 client 进入 SYN_SENT 状态,根据框架代码的提示,发送完 SYN 包之后,在 connect 中会进入以后 while 循环,循环跳出的条件是 socket 的状态变为 ESTABLISHED,所以在 tju_connect 中,只需要实现 client 发送 SYN 包的功能即可,与 while 循环即可.
1 | /* tju_connect - connect to a remote server |
tju_packet_handle
在 client 发送完 SYN 包之后,需要处于监听状态的 server 正确处理收到的 pkt, 并且根据三次握手的原则, 需要返回一个 SYN_ACK 包, 并进入 SYN_RECV 状态. 同时, 对于 client 而言, 收到 server 发送的 SYN_ACK 之后, 还需要向 server 发送一个 ACK 包, 并且将自己的连接状态置为 ESTABLISHED. 在 server 收到 client 发送的 ACK 包之后, server 也将自己的连接状态由 SYN_RECV 变为 ESTABLISHED. 这就是 tju_packet_handle 具体要实现的内容, 简单来说, 就是在连接建立的不同阶段, 正确识别对方发来的数据包并作出对应的回应, 期间涉及到 数据包构建, 数据包发送, 连接管理 和 状态转变等问题.
- Title: TJU-TCP 2024 暑期计算机网络综合实践 实验过程记录
- Author: Ryan Lu
- Created at : 2024-07-24 12:30:12
- Updated at : 2025-11-13 03:13:49
- Link: http://ryan-hub.site/b707e6c8b800/
- License: This work is licensed under CC BY-NC-SA 4.0.