java tcp 握手_Java复习-TCP三次握手四次挥手

4/7层网络模型

I. 4层网络模型:应用层、传输层、网络层、网络接口层;

II. 7层网络模型:应用层、表示层、会话层、传输层、网络层、数据链接层、物理层。

TCP协议

TCP是传输层协议,特点是:基于链接(点对点):传输数据前需要先建立链接,然后再进行传输;

双向通信:链接一旦建立,就可以进行双向通信;

可靠传输:TCP的传输是基于字节流,而不是报文,将数据按字节大小进行编号,接收端通过ACK来确认收到的数据编号,通过这种机制,TCP能够保证接受数据的有效性和完整性;

拥塞控制:通过慢启动、拥塞避免、快重传和快恢复算法达到拥塞控制。

三次握手

TCP是基于链接的,所以在传输数据前需要先建立链接;由于TCP是双工传输,所以不区分Client端和Server端;

为了便于理解,此处把主动发起建立链接的一端称为Client端,把被动建立连接的一端称为Server端。

I. 首先需要Server端先监听端口,因此Server端建立链接前的初始状态就是Listen状态;

II. Client准备建立链接,先发送一个SYN同步包,发送完同步包后Client端状态就变成了SYN_sent状态;

III.Server端收到SYN后同意建立链接,就向Client端回复一个ACK;由于TCP是双工传输,Server端也会同时向Client端发送一个同步请求SYN,

申请Server向Client建立链接,发送完ACK和SYN后,Server端的链接状态就变成了SYN_revd;

IV. Client收到Server的ACK后Client的状态就变成了established,同时Client端向Server端发送ACK响应,回复Server端的ACK请求;

V. Server端收到Client端的ACK后,Server端的链接状态也就变成了established;至此,链接建立完成。

SYN 洪水攻击发生的原因:

Server端收到Client端的SYN请求后,发送了ACK和SYN,但是Client端不进行回复,导致Server端大量的链接处在SYN_rcvd状态,从而影响其他正常请求的建连;可以通过设置tcp_synack_retries=0加快半链接回收速度,或者调大tcp_max_syn_backlog来应对少量的SYN洪水攻击。

四次挥手

由于TCP链接时双工传输,所以每个方向都必须单独关闭,且通信双方都可以先发起,为方便理解,此处把先发起的一方称为Client端。

I. 通信双方都是established状态;首先Client发起关闭链接请求,向Server发送FIN数据包,表示Client已经没有数据要发送了,然后进

入FIN_wait_1状态;

II. Server端收到FIN后返回ACK,然后进入close_wait状态(此时Sever属于半关闭状态,因为此时Client已经不会向Server再发送数据了,

但Server可能还有数据要向Client端发送);当Server端数据发送完毕后,Server端会向Client端发送FIN,表示Server也没有数据要

发送了,此时Server端进last_ACK状态,等待Client端的应答。

III.Client端收到Server端的FIN后,回复ACK,然后进入time_wait状态(time_wait状态下需要等待两倍的MSL(最大报文段生成时间)来保

证链接的可靠关闭),之后进入closed状态。

IV. Server端收到ACK后直接进入closed状态。

(2MSL的原因:1.要保证TCP协议的双工链接可靠关闭;2.要保证这次链接中重复的数据段能够从网络中消失,防止端口被重用时产生数据混淆)

实际应用中可能遇到大量Socket处于time_wait状态或者close_wait状态,一般开启tcp_tw_reuse和tcp_tw_recyle能够加快time_wait的链接回收;而如果有大量链接处于close_wait状态,则可能是被关闭的一方存在代码BUG,没有正确关闭链接导致。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值