InetAddress类的使用
* 1.如何准确地定位网络上一台或多台主机;定位主机上的特定的应用
* 2.找到主机后如何可靠高效地进行数据传输
2、网络通信的两个要素:
* 2.对应问题二:提供网络通信协议:TCP/IP参考模型(应用层、传输层、网络层、物理+数据链路层)
1.IP的理解
1. IP:唯一的标识 Internet 上的计算机(通信实体)
2. 在Java中使用InetAddress类代表IP
3. IP分类:IPv4 和 IPv6 ; 万维网 和 局域网
2.1实例化 (InetAddress类没有提供公共的构造器,而是提供了如下几个静态方法来获取 InetAddress实例)
getByName(String host) 、 getLocalHost()
getHostName() :返回 IP 地址字符串 / getHostAddress(): 获取此 IP 地址的主机名/ isReachable(int timeout):测试是否可以达到该地址
域名解析(DNS,应用层):域名容易记忆,当在连接网络时输入一个主机的域名后,域名服务器(DNS)负责将域名转化成IP地址,这样才能和主机建立连接。
2.4. 本地回路地址:127.0.0.1 对应着:localhost
要求:不同的进程不同的端口号
范围:被规定为一个 16 位的整数 0~65535。
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 等待一段时间就是为了处理这种情况的发生。
-
等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文。