InetAddress类的使用
2021-03-11 22:28
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 等待一段时间就是为了处理这种情况的发生。
-
等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文。