InetAddress类的使用

1、实现网络通信需要解决的两个问题
  * 1.如何准确地定位网络上一台或多台主机;定位主机上的特定的应用
  * 2.找到主机后如何可靠高效地进行数据传输

2、网络通信的两个要素:
  * 1.对应问题一:IP和端口号
  * 2.对应问题二:提供网络通信协议:TCP/IP参考模型(应用层、传输层、网络层、物理+数据链路层)
 
3、通信要素一:IP和端口号
  1.IP的理解
    1. IP:唯一的标识 Internet 上的计算机(通信实体)
    2. 在Java中使用InetAddress类代表IP
    3. IP分类:IPv4 和 IPv6 ; 万维网 和 局域网
      IPV4:4个字节组成,4个0-255。大概42亿,30亿都在北美,亚洲4亿。2011年初已 经用尽。以点分十进制表示,如192.168.0.1 
      IPV6:128位(16个字节),写成8个无符号整数,每个整数用四个十六进制位表示, 数之间用冒号(:)分开,如:3ffe: 3201: 1401: 1280: c8ff: fe4d:db39:1984
      192.168. 开头的就是私有址址,范围即为192.168.0.0--192.168.255.255,专门为组织机 构内部使用

  2.InetAddress类:此类的一个对象就代表着一个具体的IP地址
    2.1实例化 (InetAddress类没有提供公共的构造器,而是提供了如下几个静态方法来获取 InetAddress实例)
      getByName(String host) 、 getLocalHost()
    2.2常用方法
      getHostName() :返回 IP 地址字符串 / getHostAddress(): 获取此 IP 地址的主机名/ isReachable(int timeout):测试是否可以达到该地址
    Internet上的主机有两种方式表示地址:域名(hostName):www.xxxx.com; IP 地址(hostAddress):202.108.35.210
    InetAddress 类对象含有一个 Internet 主机地址的域名和IP地址: www.xxxx.com 和 202.108.35.210。
    2.3. 域名:   www.baidu.com   www.mi.com  www.sina.com  www.jd.com 
        域名解析(DNS,应用层):域名容易记忆,当在连接网络时输入一个主机的域名后,域名服务器(DNS)负责将域名转化成IP地址,这样才能和主机建立连接。
       2.4. 本地回路地址:127.0.0.1 对应着:localhost

  3.端口号:正在计算机上运行的进程。
    要求:不同的进程不同的端口号
    范围:被规定为一个 16 位的整数 0~65535。
      公认端口:0~1023。被预先定义的服务通信占用(如:HTTP占用端口 80,FTP占用端口21,Telnet占用端口23) 
      注册端口:1024~49151。分配给用户进程或应用程序。(如:Tomcat占 用端口8080,MySQL占用端口3306,Oracle占用端口1521等)。 
      动态/私有端口:49152~65535。

端口号与IP地址的组合得出一个网络套接字:Socket
 
4、通信要素二:网络通信协议
 
TCP三次握手

 ACK,SYN,FIN大写字母表示标志位

  • 确认 ACK :当 ACK=1 时确认号字段有效,否则无效。TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 置 1

  • 同步 SYN :在连接建立时用来同步序号。当 SYN=1,ACK=0 时表示这是一个连接请求报文段。若对方同意建立连接,则响应报文中 SYN=1,ACK=1。

  • 终止 FIN :用来释放一个连接,当 FIN=1 时,表示此报文段的发送方的数据已发送完毕,并要求释放连接。

 ack,seq小写单词表示序号:

  • ack :期待收到对方下一个报文段的序号

  • seq序号 :用来标示数据段的顺序。

三次握手的过程:

  1)首先服务器B处于监听状态,等待客户端A的连接请求;

  2)A向B发送请求连接请求报文,SYN=1,ACK=0, 并选择一个初始的序号seq=x;

  3)B收到连接请求报文,若同意连接,则向A发送连接确认报文,SYN=1,ACK=1,ack=x+1,seq=y;

  4)A收到B的连接确认报文后,还要向B发出确认,ACK=1,ack=y+1,seq=x+1;

  5)B收到A的确认后,建立连接;

为什么要三次握手:

  1)确认双方都有发送接受的能力;

  2)防止失效的连接请求到达服务器,让服务器错误的打开连接;可能因为堵塞,导致客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间才能收到服务器端发回的连接确认。客户端等待一个超时重传时间之后,就会重新请求连接。但是这个滞留的连接请求最后还是会到达服务器,那么服务器就会打开两个连接。

TCP四次挥手

四次挥手过程

1)客户端A发送连接释放报文,FIN=1;

2)B收到之后发出确认,此时TCP属于半关闭状态,B能向A发送数据,但A不能向B发送数据;

3)当B服务器不再需要连接时,发送连接释放报文,FIN=1;

4)A收到后发出确认,进入TIME-WAIT状态,等待2MSL(最大报文存活时间)后释放连接;

5)B收到A的确认后释放连接。

四次挥手的原因

客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送 FIN 连接释放报文。

TIME_WAIT

客户端接收到服务器端的 FIN 报文后进入此状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间 2MSL。这么做有两个理由:

  • 确保最后一个确认报文能够到达。如果 B 没收到 A 发送来的确认报文,那么就会重新发送连接释放请求报文,A 等待一段时间就是为了处理这种情况的发生。

  • 等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文。

 
原文地址:https://www.cnblogs.com/lemonzhang/p/12832914.html