知道分层模型
可以百度


三次握手
第 一 次 握 手 (SYN=1, seq=x) 客 户 端 发 送 一 个 TCP 的 SYN 标志 位置 1 的包,指明客 户端打算连接的服 务器的端口,以及 初始序号 X,保存 在 包 头 的 序 列 号 (Sequence Number)字段里。 发送完毕后,客户 端 进 入 SYN_SEND 状态。 第 二 次 握 手(SYN=1, ACK=1, seq=y, ACKnum=x+1): 服务器发回确认包 (ACK) 应 答 。 即 SYN 标志位和 ACK 标 志 位 均 为 1。服务器端选择自 己 ISN 序列号,放 到 Seq 域里,同时 将 确 认 序 号 (Acknowledgeme nt Number)设置为 客户的 ISN 加 1, 即 X+1。 发送完毕后,服务 器 端 进 入 SYN_RCVD 状态。 第 三 次 握 手 (ACK=1 , ACKnum=y+1) 客户端再次发送确 认包(ACK),SYN 标 志位为 0,ACK 标 志位为 1,并且把服 务器发来 ACK 的 序号字段+1,放在 确定字段中发送给 对方,并且在数据 段放写 ISN 发完毕 后 , 客 户 端 进 入 ESTABLISHED 状 态,当服务器端接收到这个包时,也 进 入 ESTABLISHED 状 态,TCP 握手结束。

SYN 攻击
在三次握手过程中,Server 发送 SYN-ACK 之后,收到 Client 的 ACK 之前的 TCP 连接称为 半连接(half-open connect),此时 Server 处于 SYN_RCVD 状态,当收到 ACK 后,Server 转入 ESTABLISHED 状态。SYN 攻击就是 Client 在短时间内伪造大量不存在的 IP 地址,并向 Server 不断地发送 SYN 包,Server 回复确认包,并等待 Client 的确认,由于源地址是不存 在的,因此,Server 需要不断重发直至超时,这些伪造的 SYN 包将产时间占用未连接队 列,导致正常的 SYN 请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN 攻 击时一种典型的 DDOS 攻击,检测 SYN 攻击的方式非常简单,即当 Server 上有大量半连接 状态且源 IP 地址是随机的,则可以断定遭到 SYN 攻击了
四次挥手

第一次挥手(FIN=1,seq=x) 假设客户端想要关闭连接,客户端发送一个 FIN 标志位置为 1 的包,表示自己已经没有数据 可以发送了,但是仍然可以接受数据。发送完毕后,客户端进入 FIN_WAIT_1 状态。 第二次挥手(ACK=1,ACKnum=x+1) 服务器端确认客户端的 FIN 包,发送一个确认包,表明自己接受到了客户端关闭连接的请求, 但还没有准备好关闭连接。发送完毕后,服务器端进入 CLOSE_WAIT 状态,客户端接收到这 个确认包之后,进入 FIN_WAIT_2 状态,等待服务器端关闭连接。 第三次挥手(FIN=1,seq=w) 服务器端准备好关闭连接时,向客户端发送结束连接请求,FIN 置为 1。发送完毕后,服务器 端进入 LAST_ACK 状态,等待来自客户端的最后一个 ACK。 第四次挥手(ACK=1,ACKnum=w+1) 客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT 状态,等待 可能出现的要求重传的 ACK 包。 服务器端接收到这个确认包之后,关闭连接,进入 CLOSED 状态。 客户端等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime) 之后,没有收到服务器端的 ACK,认为服务器端已经正常关闭连接,于是自己也关闭连接, 进入 CLOSED 状态。
【问题 1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:三次握手是因为因为当 Server 端收到 Client 端的 SYN 连接请求报文后,可以直接发送 SYN+ACK 报文。其中 ACK 报文是用来应答的,SYN 报文是用来同步的。但是关闭连接时, 当 Server 端收到 FIN 报文时,很可能并不会立即关闭 SOCKET(因为可能还有消息没处理 完),所以只能先回复一个 ACK 报文,告诉 Client 端,"你发的 FIN 报文我收到了"。只有等到 我 Server 端所有的报文都发送完了,我才能发送 FIN 报文,因此不能一起发送。故需要四步 握手。
【问题 2】为什么 TIME_WAIT 状态需要经过 2MSL(最大报文段生存时间)才能返回到 CLOSE 状态?
答:虽然按道理,四个报文都发送完毕,我们可以直接进入 CLOSE 状态了,但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。
socket怎么用
自行百度

Java IO

965

被折叠的 条评论
为什么被折叠?



