java socket机制_[Java]I/O底层原理之二:Socket工作机制

一、TCP状态转化

TCP连接的状态转换图如下

20180111002703271639.jpg

注:SYN 表示建立链接、FIN 表示关闭链接、ACK 表示响应、PSH 表示有数据传输、RST 表示链接重置。

CLOSED:初始状态,在超时或连接关闭时也会进入此状态。

LISTEN:服务端在等待连接时的状态。

SYN-SENT:客户端发起连接并发送 SYN 给服务端后等待的状态。如果不能连接,则进入 CLOSED 状态。

SYN-RCVD:服务端接受客户端的 SYN 请求,由 LISTEN 状态进入此状态。同时回应一个 SYN、ACK 给客户端。

ESTABLISHED:数据传输状态,服务端和客户端建立连接后的状态。

FIN-WAIT-1:主动关闭的一方进入此状态。等待远程TCP连接中断请求,或先前的连接中断请求的确认

FIN-WAIT-2:主动关闭的一方接收另一方的 FIN ACK进入的状态。

CLOSE-WAIT:被动关闭的一方收到 FIN 后进入的状态,接收到 FIN 的同时发送 ACK。

LAST-ACK:被动关闭的一方发起关闭请求。

CLOSING:

TIME-WAIT:

1 建立连接的步骤(三次握手)

20180111002703272616.png

客户端发送 SYN 给服务端

服务端回应 ACK 和 SYN  给客户端

客户端发送 ACK 给服务端

2 断开链接的步骤(四次挥手)

20180111002703274569.png

客户端发送 FIN 给服务端

服务端回应 ACK

服务端关闭链接,发送 FIN 给客户端

客户端回应 ACK 给服务端

二、Socket

一个 Socket 实例代表了一个通信链路,当连接建立成功后,服务器和客户端都会各拥有一个 Socket 实例,且这两个实例都会拥有一个 InputStream 和 OutputStream,以此来传输数据。在 InputStream 和 OutputStream 中会各有一个缓存区,数据写入和读取都是通过这个缓存区完成的。通过 OutputStream 将数据写入到其 SendQ 队列中,当队列填满时,数据将被传递到 InputStream 的 RecvQ 队列中,如果这时 RecvQ 已满,则 OutputStream 的 write() 方法将会阻塞,直到 RecvQ 队列有足够空间容纳 SendQ 发送的数据。要注意的是,缓存区的大小及读写宿舍非常影响连接的传输效率,而且由于是阻塞式,如果两遍同时传递数据有可能发生死锁。

Socket源码分析:

public Socket() // 创建一个无连接的socket

public Socket(Proxy proxy) //

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值