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的状态来判断连接状态。
posted @ 2023-02-22 22:45  无糖百事  阅读(30)  评论(0)    收藏  举报