都说 TCP 是面向连接的,那么怎样才算是一个连接呢?
TCP 不是桥
- 连接:在自己监听的端口接收到连接的请求,然后经过“三次握手”,维护一定的数据结构和对方的信息,确认了该信息:我发的内容对方会接收,对方发的内容我也会接收,直到连接断开。 - 断开:经过“四次挥手”确保双方都知道且同意对方断开连接,然后 remove 掉为对方维护的数据结构和信息,对方之后发送的包也不会接收,直到再次连接。
我看到有的同学说,TCP 是建立了一座桥,我认为这个比喻不恰当,TCP 更好的比喻是在码头上增加了记录人员,核查人员和督导人员,至于 IP 层和数据链路层,它没有任何改造。
本质是数据结构
TCP 建立连接的本质是在客户端和服务端各自维护一定的数据结构(一种状态机),来记录和维护这个“连接”的状态。并不是真的会再这两个端之间有一条类似的“网络专线”这么一个东西。
在 IP 层,网络情况该不稳定还是不稳定,数据传输走的什么路径上层是控制不了的,TCP 能做的只能是做更多判断,更多重试,更多拥塞控制之类的东西。
连接只是一个术语
包最终都是通过链路层、物理层一个一个出去的,所以连接只是一种逻辑术语,并不存在像管道那样子的东西,连接在这里相当于双方的一种约定,双方按说好的规矩维护状态。
维护状态
3 次握手之后,咱俩之间确认自己发的东西对方都能收到,然后咱俩各自维护这种状态,连接就建立了。
连接是一种状态,建立连接是维持一种状态,维持状态通过一定的数据结构来完成。