b java.net包源码详解
文章目录
脑图有描绘java.net的结构。
java.net是java最早的网络编程工具包。主要是C/S结构的BIO模型,效率比较低。
常用的包有nio,以及netty包。
一、Addresses
- 处理IP协议ipv4/ipv6
- 处理socket地址(ip+port)
名词解释
名称 | 翻译 | 描述 |
---|---|---|
unicast | 单播 | 指数据包发送一个目的地址,TCP和UDP都可以 |
multicast | 和多播 | 多播数据包同时发送到多个目的地址,只有UDP可以 |
1.1 InetAddressImpl
inetAddressImpl一系列的类需要调用本地方法。这里类是私有的,用户不可见。会被注入到InetAddress类中。
- anyLocalAddress是
0.0.0.0
1.2 InetAddress类
- originalHostName 原始的hostname的保留,对一些domain格式命名的host特别有用,比如 a.dome.s
- hostname 主机标识
- int address 地址
- family 地址簇,ipv4 标识是1,ipv6标识是2
功能
- 存储ip的元数据信息比如上面的hoder
- 调用本地方法,获取hostname,ipv4,ipv6地址,回环地址
- ip的地址是有不同性质的,比如是否是回环地址,网站地址,该地址是否有效。提供一系列is方法来判断。
- 私有方法提供缓存机制
- 工具方法提供域名解析,比如输入域名地址和域名返回Ip等
1.3 SocketAddress
ip+port的载体,被用于socket的binding和connecting或者返回值。
二、SOCKET 套接字
tcp是一个c/s结构,sockets分为Socket和ServerSocket。
2.1 tcp socket
Scoket 类
c/s的client端。Field
:SocketIml 真正操作socket动作的类,调用本地方法method
- bind() 方法,绑定adress类(ip+port)
- connect() 实质是调用
impl
的connect方法,真正的发起联接 - getInputStream()/getOutputStream()方法,获取输入输出流
- getChannel(),channel是一种新的模型比InputStream更好用。
- 设置一些套接字状态的方法,核心就是下面的SocketOptions
ServerSocket 类
对adress(ip+port)进行监听,监听实际上是通过监听backlog
,accept()方法是一个阻塞性方法,调用时就去查询backlog
,有记录就链接
每来一个链接,就会产生一个socket相关的fd。这个
backlog
其实就是一个数组,记录链接的数量。
- accept方法对应socket的connect,是服务端进行连接的,发起时是一个阻塞式的等待,就是传统的BIO模型。
2.2 udp socket
DatagramPacket
UDP包的数据格式
DatagramSocket
和TCP不同,UDP并不建立连接。通过bind函数来监听某一个端口,并从这个个端口接受数据(也可以在使用receive是指定其他端口)。
- bind 指定收发数据的端口
- conect函数。UDP并不建立连接,但是这里的connect,会丢弃到不是目标address的数据包。
MulticastSocket
多个部署组
2.3 SocketOptions
套接字状态,说明一个套接字的名称和类型。
底下有一堆实现类,这些实现类会被注入到Socket中。
SocketImpl–TCP类
- 一个socketImpl支持socket类和ServerSocket,同时有fd文件,adress目标端口。和本地用来通信的端口
AbstractPlainSocket
抽象类,ScoketImpl的子类,有更具体的业务逻辑实现。而SocketImpl仅仅是定义了方法没有实现。
PlainSocketImpl
协议无关的AbstractPlainSocket子类。调用了大量的native方法。
HttpConnectSocketImpl
基于HTTP协议的socketimpl,就是基于http协议,比如websocket
SocketImpl–UDP类
DatagramSocketImpl
为multicast准备的,就是UDP。
- connect并不是链接,而是排斥未知来源的包
- setTTL 包的失效时间
- 这也是一个可以包含多个adress的组,同时把包发给多个IP
SocketImpl–socks类
一种网络穿透协议,需要server和client,具体可以在后面专门开篇幅去讲,也会讲到代理的编程
套接字状态StandardScoketOptions
一个工具类定义了socket的几种状态。
标准的套接字状态,ScoketOptions
是较早的状态标识,后面统一用StandardScoketOptions
。
名称 | 含义 |
---|---|
IP_MULTICAST_IF | Internet协议(IP)多播数据报的网络接口。 |
IP_MULTICAST_LOOP | Internet协议(IP)多播数据报的回环IP |
IP_MULTICAST_TTL | Internet协议(IP)多播数据报 的生存时间 |
IP_TOS | Internet协议(IP)标头中的服务类型(ToS)八位字节。 |
SO_BROADCAST | 允许传输广播数据报。 |
SO_KEEPALIVE | 保持连接活着。 |
SO_LINGER | 如果数据存在,则关闭。 |
SO_RCVBUF | 套接字接收缓冲区的大小。 |
SO_REUSEADDR | 重复使用地址。 |
SO_REUSEPORT | 重用端口。 |
SO_SNDBUF | 套接字发送缓冲区的大小。 |
TCP_NODELAY | 禁用Nagle算法。 |
2.4 NetworkInterface
这个接口也是同样使用本地方法,是本地的网络信息的模型,也是提供了工具去访问。
NetworkInterface
三、URLConnection
URI包括URL和URN两个类别,URL是URI的子集,所以URL一定是URI,而URI不一定是URL
URI = Universal Resource Identifier 统一资源标志符,用来标识抽象或物理资源的一个紧凑字符串。
URL = Universal Resource Locator 统一资源定位符,一种定位资源的主要访问机制的字符串,一个标准的URL必须包括:protocol、host、port、path、parameter、anchor。
URN = Universal Resource Name 统一资源名称,通过特定命名空间中的唯一名称或ID来标识资源。理解
个人的身份证号就是URN,个人的家庭地址就是URL,URN可以唯一标识一个人,而URL可以告诉邮递员怎么把货送到你手里。
3.1 URI
URI是网络资源的描述格式。形如URI = scheme ":" hire-part ["?" query] [ "#" fragment ]
这个类就是这个协议字段的载体,用来生成和处理这些字段
3.2 URL
URI除了URI还附带协议属性,就是包含描述如何传递的方式
。
类定义filed
- protocl 协议的标识字段
- address ip+port的地址
- connection 这个就是与协议对应的链接描述。
method
- uri的处理
- connection的处理
3.3 Connection
与协议相关的实现类。
对不同协议的解析和处理。
类的成员包含URL的定义,和conection建立连接的定义。
具体的解析行为在实现类上
3.4 httphandle
工具类,被定义用来解析request或者response,不同状态和不同容容块的工具。
这样的好处是,把解析逻辑和目标内容,封装在一起,方便把整个过程拆分成小截。