码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-09-03 22:13:47      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:puts   阻塞   ast   建立   alt   inpu   响应   读写   9.png   

一、TCP状态转化

TCP连接的状态转换图如下

技术分享

 注: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 建立连接的步骤(三次握手)

 技术分享

  1. 客户端发送 SYN 给服务端
  2. 服务端回应 ACK 和 SYN  给客户端
  3. 客户端发送 ACK 给服务端

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

技术分享

  1. 客户端发送 FIN 给服务端
  2. 服务端回应 ACK
  3. 服务端关闭链接,发送 FIN 给客户端
  4. 客户端回应 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) // 

 

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

标签:puts   阻塞   ast   建立   alt   inpu   响应   读写   9.png   

原文地址:http://www.cnblogs.com/tengyunhao/p/7302575.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!