[Java] I/O底层原理之二:网络IO及网络编程
首先我们来看一下当访问一个域名时它的过程
- 查找 DNS
- 首先,浏览器检查缓存中有没有
- 浏览器缓存中没有,则查找操作系统中有没有配置这个对应关系
- 如果操作系统中也没有,则去 DNS 查找,即发送DNS报文:传输层(UDP数据报)-> 网络层(IP数据包)-> 数据链路层(协议单元)
- 如果发送时 ARP 缓存中没有相关数据,则发送 ARP 广播,等待 ARP 回应
- ARP 回应后,将 IP 地址与下一跳 MAC 地址写入 ARP 缓存表
- 经过多次转发后,数据到达 DNS 服务器,并解析到 IP 地址
我们先来看一下 TCP/IP 分层与 OSI 分层的关系

网络层 —— IP(网络之间的互联网协议)、ARP(地址解析协议)、RARP、ICMP
传输层 —— TCP(传输控制协议)、UDP(用户数据报协议)
应用层 —— TeInet(远程登录服务的标准协议)、SMTP(电子邮件协议)、NFS(网络文件服务协议)、SNMP(网络管理协议)、FTP(文本传输协议)、HTTP(超文本传输协议)
本篇博客主要讲述 TCP 协议和 UDP 协议在 Java 中的应用,下面我们来看一下两者的区别:
- TCP 协议是一种链接可靠的传输协议,通过 TCP 协议传输,得到的是一个顺序无差错的数据流。但是可靠的传输是要付出代价的,对数据的验证会占用计算机处理时间和网络带宽。所以 TCP 传输效率不如 UDP 高。
- UDP 协议是一种无链接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传送至目的地,但达到目的地的时间及内容的正确性都是不能保证的。在不需要严格保证传输可靠性时,可以使用 UDP 协议,如视频、音频等。
一、Socket与ServerSocket
1 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 建立连接的步骤(三次握手)

- 客户端发送 SYN 给服务端
- 服务端回应 ACK 和 SYN 给客户端
- 客户端发送 ACK 给服务端
2 断开链接的步骤(四次挥手)

- 客户端发送 FIN 给服务端
- 服务端回应 ACK
- 服务端关闭链接,发送 FIN 给客户端
- 客户端回应 ACK 给服务端
2 Socket
一个 Socket 实例代表了一个通信链路,当连接建立成功后,服务器和客户端都会各拥有一个 Socket 实例,且这两个实例都会拥有一个 InputStream 和 OutputStream,以此来传输数据。在 InputStream 和 OutputStream 中会各有一个缓存区,数据写入和读取都是通过这个缓存区完成的。通过 OutputStream 将数据写入到其 SendQ 队列中,当队列填满时,数据将被传递到 InputStream 的 RecvQ 队列中,如果这时 RecvQ 已满,则 OutputStream 的 write() 方法将会阻塞,直到 RecvQ 队列有足够空间容纳 SendQ 发送的数据。要注意的是,缓存区的大小及读写宿舍非常影响连接的传输效率,而且由于是阻塞式,如果两遍同时传递数据有可能发生死锁。
[Java] I/O底层原理之二:网络IO及网络编程的更多相关文章
- 深入源码分析SpringMVC底层原理(二)
原文链接:深入源码分析SpringMVC底层原理(二) 文章目录 深入分析SpringMVC请求处理过程 1. DispatcherServlet处理请求 1.1 寻找Handler 1.2 没有找到 ...
- java面试-CAS底层原理
一.CAS是什么? 比较并交换,它是一条CPU并发原语. CAS是一种无锁算法,CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B.当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什 ...
- 【Spring Data JPA篇】JPA的底层原理(二)
一.接口继承结构 二.底层原理
- [Java] I/O底层原理之一:字符流、字节流及其源码分析
关于 I/O 的类可以分为四种: 关于字节的操作:InputStream 和 OutPutStream: 关于字符的操作:Writer 和 Reader: 关于磁盘的操作:File: 关于网络的操作: ...
- 基于JAVA Socket的底层原理分析及工具实现
前言 在工作开始之前,我们先来了解一下Socket 所谓Socket,又被称作套接字,它是一个抽象层,简单来说就是存在于不同平台(os)的公共接口.学过网络的同学可以把它理解为基于传输TCP/IP协议 ...
- Java 注解及其底层原理
目录 什么是注解? 注解的分类 Java自带的标准注解 元注解 @Retention @Documented @Target @Inherited @Repeatable 自定义注解 自定义注解的读取 ...
- (转载)Java NIO:NIO原理分析(二)
NIO中的两个核心对象:缓冲区和通道,在谈到缓冲区时,我们说缓冲区对象本质上是一个数组,但它其实是一个特殊的数组,缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况,如果我们使用 ...
- [Java] I/O底层原理之三:NIO
本篇文章参考自并发编程网 一.NIO 的概述 NIO 由以下几个核心组成 Channels Buffers Selectors 选择器用于监听多个通道的事件(如:链接打开.数据达到),单个线程可以监听 ...
- Java 总结 数据底层原理 【包括 ArrayList、LinkedList、hash table、HashMap、Hashtable、ConcurrentHashMap、hash code、HashSet、LinkedHashMap、LinkedHashSet】
1.ArrayList (1)底层是由动态数组实现的[使用了List接口]. (2)动态数组是长度不固定,随着数据的增多而变长. (3)如果不指定,默认长度为10,当添加的元素超过当前数组的长度时,会 ...
随机推荐
- LOJ#6354. 「CodePlus 2018 4 月赛」最短路[最短路优化建图]
题意 一个 \(n\) 个点的完全图,两点之间的边权为 \((i\ xor\ j)*C\) ,同时有 \(m\) 条额外单向路径,问从 \(S\) 到 \(T\) 的最短路. \(n\leq 10^5 ...
- REST-framework快速构建API--认证
一.API使用流程 使用过API的同学都知道,我们不可能任意调用人家的API,因为通过API可以获取很多关键数据,而且这个API可能供多个部门或个人使用,所以必须是经过授权的用户才能调用. API的使 ...
- vue-router单页应用简单示例(三)
用vue-resource向服务器请求数据 我们主要来了解一下以下内容: 模拟服务端返回数据 用vue-resource向服务器请求数据 模拟服务器返回数据 我们用vue-cli创建的项目中,已经 ...
- Docker 部署学习
https://yeasy.gitbooks.io/docker_practice/basic_concept/repository.html https://hujb2000.gitbooks.io ...
- BCompare破解方法
1.删除 BCUnrar.dll 文件,重启软件. 备注:使用everything搜索BCUnrar.dll
- Muduo学习笔记(一) 什么都不做的EventLoop
Muduo学习笔记(一) 什么都不做的EventLoop EventLoop EventLoop的基本接口包括构造.析构.loop(). One Loop Per Thread 一个线程只有一个Eve ...
- Linux 终端快捷键整理
一.历史命令相关快捷键 快捷键 说明 ↑.↓ 显示历史命令 !! 执行上一个命令 !n 执行历史命令中第 n 条命令 !-n 执行历史命令中倒数第 n 条命令 二.移动相关快捷键 快捷键 说明 Ctr ...
- B1030 完美数列 (25 分)
这是一道二分法的题目,许久不使用二分法,感觉有点生疏. #include<bits/stdc++.h> using namespace std; const int MAXN=100000 ...
- python自定义mininet拓扑
python自定义mininet拓扑 前言 闲来无聊,想到很早之前都是用GUI来自定义拓扑,这次用python来自定义一下(以前留下的苦果) 转自Mininet 自定义网络拓扑 过程相对简单 实现过程 ...
- c++中队列queue和栈stack的基本操作
1.queue 模板类的定义在<queue>头文件中. 定义queue 对象的示例代码如下:queue<int> q1;queue<double> q2; queu ...