lab4-TCPconnection
该lab的难度相对较高。在本lab中,需要处理Tcp连接的全过程——发起连接、维护连接以及结束连接。
仓库地址:https://gitlab.eduxiji.net/NScola/wuhaocs144/-/tree/master/libsponge
为能清晰的描绘Tcp连接中的变化,本人使用有限状态机进行TCPconnection的实现。
LISTEN,
// 主动连接
SYN_SENT,
// 被动连接
SYN_RCVD,
ESTABLISHED,
// 主动关闭
FIN_WAIT1,
FIN_WAIT2,
CLOSING,
TIME_WAIT,
// 被动关闭
CLOSE_WAIT,LAST_ACK,CLOSED,
ERROR
1. segment_received()
该函数是最为重要的部分,负责处理段的接收以及后续根据接受段产生的一系列的反应,包括状态的变化、TcpSender以及TcpReiceiver的动作等等。
这里首先要注意的是不同状态处理的顺序关系,简单来说就是要从后往前处理状态,如先处理FIN_WAIT再处理ESTABLISHED,否则就会出现同一次调用发生了多次状态转换的情况。
其次,只有接收到长度大于0的段才考虑回复(对方请求数据或纯ack段)。
2. end_input_stream()
该函数设置fin并循环发送等待发送的段。
3. tick()
该函数处理多次超时、段的重发以及超时关闭。
另外要清楚Tcp连接过程的三次握手和四次挥手的具体情况
[三次握手与四次挥手](http://wjhsh.net/findumars-p-8030426.html "三次握手与四次挥手")。
三次握手:双方都进入ESTABLISHED状态后才开始发送数据。
四次挥手:有可能跳过FIN_WAIT1直接进入FIN_WAIT2状态,且应以sender和receiver的状态来判断连接状态。

浙公网安备 33010602011771号