JavaSE 进阶(二十一)
计算机网络
计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备通过通信线路连接起来,在网络操作系统、网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
网络模型
IP 地址
IP 地址是 IP 协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
IPv4 地址是一个32位的二进制数,被分割为4个8位二进制数(也就是4个字节)。IPv4 地址通常用点分十进制表示成(a.b.c.d)的形式,其中,a、b、c、d 都是0~255之间的十进制整数。
IPv6 地址有128位长,IPv6 的128位地址通常写成8组,每组为四个十六进制数的形式。
分类
IP 地址分为五类,A 类保留给政府机构,B 类分配给中等规模的公司,C 类分配给任何需要的人,D 类用于组播,E 类用于实验,各类可容纳的地址数目不同。
网络号用于识别主机所在的网络,主机号用于识别该网络中的主机。
测试
1 | package ml.guest997; |
网络端口
一般是指 TCP/IP 协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于 FTP 服务的21端口等等。在单个协议下端口号不能冲突。
分类
- 共有端口:0 - 1023
- HTTP:80
- HTTPS:443
- FTP:21
- Telent:23
- 程序注册端口:1024 - 49151
- Tomcat:8080
- MySQL:3306
- Oracle:1521
- 动态或私有端口:49152 - 65535
通信协议
通信协议是指双方实体完成通信或服务所必须遵循的规则和约定。交流什么、怎样交流及何时交流,都必须遵循某种互相都能接受的规则。这个规则就是通信协议。
- TCP:用户传输协议
- UDP:用户数据报协议
- IP:网络互连协议
TCP
三次握手
三次握手其实就是指建立一个 TCP 连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。实质上,其实就是连接服务器指定端口,建立 TCP 连接,并同步连接双方的序列号和确认号,交换 TCP 窗口大小信息。
- 第一次握手:客户端发包,服务端收到了。服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。
- 第二次握手:服务端发包,客户端收到了。客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。
- 第三次握手:客户端发包,服务端收到了。服务端就能得出结论:客户端的接收、发送能力正常,服务端的发送、接收能力也正常。
为什么需要三次握手,两次不行吗?
如客户端发出连接请求,但因连接请求报文丢失而未收到确认,于是客户端再重传一次连接请求。后来收到了确认,建立了连接。数据传输完毕后,就释放了连接。
客户端共发出了两个连接请求报文段,其中第一个丢失,第二个到达了服务端,但是第一个丢失的报文段只是在某些网络结点长时间滞留了,延误到连接释放以后的某个时间才到达服务端,此时服务端误认为客户端又发出一次新的连接请求,于是就向客户端发出确认报文段,同意建立连接,此时客户端收到服务端发来的确认,也没有数据可发送,则服务端一直等待客户端发送数据,浪费资源。
四次挥手
终止一个连接要经过四次挥手。这是由于 TCP 的半关闭造成的。所谓的半关闭,其实就是 TCP 提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。TCP 连接的拆除需要发送四个包,因此称为四次挥手,客户端或服务端均可主动发起挥手动作。
- A 发送断开请求。(需要等待 B 的回复,不然 B 未收到消息,就单方面的断开有点不负责任。超时重传)
- B 收到请求并回复 A。(B 收到请求后,很伤心,但是没有办法,只能断开连接,但是 B 是被动的接收断开,所以需要通知其应用程序做关闭准备)
- B 这边准备完了,通知 A 可以断开了。
- A 回复 B,我收到消息了,那就断开连接吧。
为什么建立连接是三次握手,而关闭连接却是四次挥手呢?
这是因为服务端在 LISTEN 状态下,收到建立连接请求的 SYN 报文后,把 ACK 和 SYN 放在一个报文里发送给客户端。其中,ACK 报文是用来应答的,SYN 报文是用来同步的。但是关闭连接时,当服务端收到 FIN 报文时,很可能并不会立即关闭 SOCKET,所以只能先回复一个 ACK 报文,告诉客户端:你发的 FIN 报文我收到了。只有等到我服务端所有的报文都发送完了,我才能发送 FIN 报文,因此不能一起发送。故需要四次挥手。