[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,当添加的元素超过当前数组的长度时,会 ...
随机推荐
- idea ssm项目迁移到另一台机器上时出现不能正常启动项目的解决方案
首先右下角提示关联spring文件,关联之,然后启动,发现项目无法启动,然后开始排错 首先从这个日志里发现了这么一条提示信息 然后百度了一下,答案都是说 web.xml 之类的 spring拦截器问题 ...
- bootstrap-validator基本使用(自定义验证身份证号和手机号)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- Ubuntu16.04+Java8+Mysql5.7+Tomcat8.5服务器环境配置
本文章使用环境: Ubuntu16.04 Java8 Mysql5.7 Tomcat8.5 Ubuntu 版本16.04, 本文采用SSH远程登录主机 工具:Xshell 默认使用root用户登录 ( ...
- dokuwiki编辑器修改-color插件-添加按钮
需求 dokuwiki的编辑工具栏是以 MediaWiki 的为基础发展来的. 在它的编辑器color插件的颜色按钮中,我想添加新的按钮功能.如红色字体黄色背景的修饰,类似于涂中文字强调的意思. 步骤 ...
- PAT甲题题解-1126. Eulerian Path (25)-欧拉回路+并查集判断图的连通性
题目已经告诉如何判断欧拉回路了,剩下的有一点要注意,可能图本身并不连通. 所以这里用并查集来判断图的联通性. #include <iostream> #include <cstdio ...
- 团队项目M1展示成绩和Week 10分数
根据M1项目评审的分数,分档打分得到的M1项目成绩.
- Linux第一章第二章学习笔记
第一章 Linux内核简介 1.1 Unix的历史 它是现存操作系统中最强大最优秀的系统. 设计简洁,在发布时提供原代码. 所有东西都被当做文件对待. Unix的内核和其他相关软件是用C语言编写而成的 ...
- linux内核分析--计算机是如何工作的
实验部分 使用gcc -S -o main.s main.c -m32命令将源代码编译成汇编代码. 源代码如下: int g(int x) { return x + 9; } int f(int x) ...
- Linux内核分析——第五周学习笔记
第五周 扒开系统调用的“三层皮”(下) 一.知识点总结 (一)给MenuOS增加time和time-asm命令 在实验楼中,首先 强制删除menu (rm menu -rf) 重新克隆一个新版本的me ...
- Alpha版总结会议——班级派
一.开会的过程 在周一下午上课的最后20分钟内,我们组进行了“班级派”的alpha版的总结会议.首先进行的是分析目前的版本情况,每个人说了自己的进度,包括已经完成的以及即将要完成的.随后是分析前段时间 ...