非科班程序员迅速理解TCP连接的本质

首先,网络是基于IP的。IP协议给网络中的每个节点分配了一个地址,并且允许你从某个节点发送少量数据到另一个节点,但是这并没有什么太大价值,因为我们没法确认数据是否真的到达对方节点了,并且是否按照正确的顺序到达了。

如果我们想要一套抽象的机制来传输任意数量的数据,并且保证它们顺序到达对方节点,我们需要在IP协议上方增加一个协议,用于处理传输中的顺序和保证到达,这正是TCP协议的目标。

和TCP并列的,是另一个传输层协议——UDP,UDP协议不做任何检查,不保证数据一定到达,不保证顺序。UDP仅仅是在原始IP数据包上面做了一层薄薄的封装,加了一些元数据(如端口号)。

Socket:socket的英文含义有插座的意思(想象两台有插座的机器通过插线连起来),Socket在计算机领域表示的是在两台通信的计算机之间的一个endpoint(端点)。Socket通常情况下是基于TCP的,但不是绝对的。在编程语言中的Socket对象,通常映射到操作系统提供的用于TCP/IP通信的API。

网络上的两个节点要通过TCP通信的话,需要建立TCP连接,即三次握手。所谓的TCP连接的建立,我理解的是,两台网络上的计算机都知道对方的IP+Port组成的endpoint可以用于收发数据。建立的过程就在于确认双方的收发能力都没有问题。一个连接是由(客户端IP、客户端Port、服务端IP、服务端Port)4元组唯一标识的。

TCP连接并不是物理上存在一条链路,而是网络上的两个节点都知道彼此的收发信息的能力没问题后维护在本地的一个对象,这个对象有几种状态,对应的是TCP连接的状态(ESTABLISHED、TIME_WAIT、CLOSE等)。

那么既然TCP连接是“假的”,物理上不存在的,为什么还要尽量复用TCP连接,不重新创建新的连接呢?原因主要有下面的两个:

  1. 连接的建立,即双方确认彼此收发信息能力没问题是需要先发送几个包来确认的,有时间成本,即连接的建立是需要时间的。
  2. 同样的连接(即连接4元组是相同的)关闭之后是不能立刻打开的。因为如果连接断开之后重新打开,相当于建立了两个连接,新打开的连接不应该接收老连接发送的数据(老连接发送的数据可能游荡在网络上一定时间后才到达,这时服务端重新打开了连接),因为这次服务端可能是另外的进程或者线程打开了这个连接,如果还接受老连接发送过来的数据,就混了。为了防止这种情况发生,连接关闭之后是得等待一定的时间才可以重新打开,以保证原来的客户端的老连接发送的游荡在网络上的数据超时失效。

参考资料:
余春龙《软件架构设计》 55页
https://stackoverflow.com/questions/8156254/tcp-vs-udp-what-is-a-tcp-connection
https://stackoverflow.com/questions/6419811/any-difference-between-socket-connection-and-tcp-connection
https://www.ciscopress.com/articles/article.asp?p=769557&seqNum=2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值