四次挥手(客户端A服务端B断开连接):
客户端A向服务端发送FIN,并停止发送数据,主动关闭TCP连接但还可以接收数据,进入FIN_WAIT_1状态。
B发出ACK确认,A至B的连接被释放,TCP处于半关闭状态(B仍可以发送数据,A仍可以接收数据),B进入CLOSED_WAIT状态。
A收到B的ACK之后进入FIN_WAIT_2状态,等待B发出的FIN。
当B发送完数据后,就发送连接释放报文段(FIN=1)给A,B进入LAST_ACK状态,等待A确认。
A收到B的FIN后,发送确认ACK,进入TIME_WAIT状态。
B收到ACK之后,进入CLOSE状态,B至A的连接关闭。
A在经过时间等待计时器设置的时间(2MSL)后关闭。
Conclusion:每个方向(双向连接)需要一个FIN和ACK,故为四次挥手。
Tips:保活计时器:防止客户端发生故障而中途无法发送数据致使服务端无效等待。服务端每次接收到客户端发来的数据后都会重置保活计时器(两小时),若在两小时内没有接收到客户端响应,则发出探测报文段,每隔一定时间(75ms)发出一个,连续发十个,若仍无响应则认为客户端故障,关闭连接。
java.net.InetAddress 常用API
import java.net.InetAddress;
public class getLocalHost{
public static void main(String[] args) throws UnknownHostException {
InetAddress ip = InetAddress.getLocalHost();
System.out.println(ip);
//打印当前主机名和IP
System.out.println(ip.getHostAddress());
//打印当前主机IP地址
System.out.println(ip.getHostName());
//打印当前主机名
System.out.println(InetAddress.getByName("www.tencent.com"));
//打印指定网址的IP
}
}
可以通过InetAddress.getLocalHost(),或者InetAddress.getByName("host")创建ip对象,此对象包含方法getHostAddress()和getHostName()
端口相关知识:
1.端口用来唯一标识一台计算机上的一个应用程序。IP地址加端口号可以标识一台主机的一个应用程序。
2 .端口是一个逻辑概念,当一个使用网络的软件运行时,操作系统会自动为此软件随机分配一个端口号,或者软件向系统要一个指定的端口号。软件端口是应用层的各种协议进程与运输实体进行层间交互的一种地址。
3 .用两字节(16b,0-65535)标识一个端口号,一个应用程序可以占多个端口号。
4 .编写程序所占端口号一般为1024之上。端口号分为TCP端口和UDP端口,两种端口号各有65536个,TCP端口号8888和UDP端口号8888是不同的端口号。
5.端口号分类:
服务器端使用的端口号:
系统端口号:0~1023 (10b)
IANA(互联网数字分配机构)将这些端口号指派给TCP/IP最重要的应用程序。
登记端口号:1024~49151
分配给用户或者程序。
客户端使用的端口号:
49152~65535
客户进程运行时动态分配回收。
Java 端口类 InetSoecketAddress类
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
public class getLocalHost {
public static void main(String[] args) throws UnknownHostException {
InetSocketAddress inetSocketAddress = new InetSocketAddress("192.168.255.1", 8082);
//IP地址+端口号初始化
System.out.println(inetSocketAddress);
//IP地址+端口号
System.out.println(inetSocketAddress.getHostName());
//主机名
//LAPTOP-UNQ&MMII
System.out.println(inetSocketAddress.getPort());
//端口号
//8082
System.out.println(inetSocketAddress.getAddress());
//主机地址
//192.168.255.1
}
}