专栏名称: 爬蜥
目录
相关文章推荐
51好读  ›  专栏  ›  爬蜥

一文告诉你java NIO底层用到的那些connect、bind、listen、accept、close

爬蜥  · 掘金  ·  · 2018-07-31 03:20

正文

阅读 13

一文告诉你java NIO底层用到的那些connect、bind、listen、accept、close

一个TCP请求的基本过程是怎样的?

socket

用于指定通信的协议类型,它的返回值为socket descriptor

函数定义为 int socket(int family,int type,int protocol),在 sys/socket.h中定义。

  • family:指定协议族,比如 AF_INET表示IPv4协议,AF_INET6表示IPv6协议
  • type:表明套接字类型,比如 SCOK_STREAM 表示字节流套接字,SCOK_DGRAM表示数据报套接字
  • protocol:表示某个协议类型的常量值,一般为0,表示对所有family和type的用系统默认值。IPROTO_TCP表示TCP协议,IPROTO_UDP表示UDP协议

connect

客户端用来建立与TCP服务器的连接,它的调用将激发TCP的三路握手,即会使当前套接字从CLOSED状态转移到SYN_SENT状态,若成功再转移到ESTABLISHED状态。只有连接建立或者出错才会返回。

connect失败则该套接字不可再用,必须关闭,想要重连接必须再调用socket

connect在那些情况下会出错?

  1. 客户端没有收到SYN的响应,返回ETIMEDOUT错误。

对于4.4BSD内核发送SYN,没有响应再等6s发送,无响应等24s,如果总共等了75s仍然没有就返回ETIMEDOUT错误

  1. 客户端收到SYN响应为RST,返回ECONNREFUESED错误。

这是种硬错误。收到RST可能是:没有服务器监听连接的端口;TCP想取消连接;TCP收到一个根本不存在的连接上的分节

  1. 路由器引发了‘destination unreachable’ ICMP错误。

这是种软错误







请到「今天看啥」查看全文