一文看懂Socket,backlog,连接超时,连接拒绝,读取超时

基本背景

一般我们写代码,作为服务方发布服务或者请求别人的服务的时候,都可能会接触到Socket编程。当然socket实际上已经比较底层了,平时用的各种框架的话,基本上是看不到的,都已经封装好了。但是对于基本的原理,我们还是需要了解一下的。
最基本的问题:套接字(socket)到底是啥?怎么理解。平时在请求服务的过程中遇到的各种连接异常,到底是什么意思。

Socket

socket是TCP连接的一种具体展现形式。我们经常会说到tcp连接,包括它的一些基本的属性或者概念,但这种连接是非常抽象的,那么在编码的时候肯定要把它进行具体化,就是socket,所以:

一个TCP连接=客户端socket+服务端socket

socket成对出现才是有意义的,它们一起代表了一个TCP连接。之后每次的交互都会通过socket进行。

socket建立过程与backlog

通过一张图看一下,socket建立过程与backlog的意义:
在这里插入图片描述

  1. 服务端监听端口。
  2. 客户端发起连接请求。
  3. TCP第一次握手:客户端发起SYN请求。
  4. 服务端收到SYN,同时把这次半连接请求放入消息队列。同时进行TCP第二次握手,回复SYN以及客户端SYN的ACK。
  5. TCP第三次握手:客户端发出服务端SYN的ACK,客户端Socket建立。
  6. 服务端接收到ACK,服务端socket建立。同时会把socket从半连接的队列取出来放进大小为backlog的队列中。
  7. 应用程度调用ServerSocket的accept方法,从队列里面取出socket进行处理。

上述过程其实也比较清晰,accept队列(size=backlog)就是存储了已经建立了连接但是还没有被应用程度所处理的socket。当队列满了以后,新的连接请求会直接被拒绝。

连接超时,连接拒绝与读取超时

一张图说明这三者发生的所有场景:

在这里插入图片描述
图中应该很详细,就不细说了。如果有其它意见,欢迎提出。
话说这几个概念,花了不少时间才慢慢理清楚了。后面做测试的时候,用的BIO进行测试的。

猜你喜欢

转载自blog.csdn.net/ywg_1994/article/details/103111637