Java随笔-TCP

概述

  • TCP是面向连接的通信协议,通过三次握手建立连接,然后开始数据读写,通信完成后断开连接。因为是面向连接的,所以只能适合端对端的通信。
  • TCP提供的是可靠的数据流服务,当数据流大的时候,数据会被拆分发送,所以超时重传机制和应答确认机制就至关重要。超时重传的时长是根据网络情况动态调整的,抽样统计一个数据包由发送到接收再到回复的时长,这个时间为RTT,也就往返时延,最后通过各种算法和公式平滑RTT确定重传超时时长。
  • 因为有分包机制,所以进行数据传输时并不能保证数据包按照顺序到达,TCP就会对数据包进行错误检查,有损坏的可以被重传,没有损坏的按照序号对包进行排序,确保数据的正确性。
  • 因为发送端和接收端的能力不同,所以TCP会根据实际接受能力来限制发送方的发送速度来进行流量控制,这种控制方式叫滑动窗口。
  • TCP属于全双工,也即是通信的双方都可以同时传输数据。

三次握手

三次握手是TCP在提供面向有连接的通信传输之前做的准备工作,确保连接可靠。三次握手是指建立一个TCP连接时需要客户端和服务端总共发送三个包来确认连接的建立。

握手流程

请添加图片描述
第一次握手:客户端将标志位SYN标记为1,随机产生seq=J,并将该数据包发送给服务器,此时客户端进行SYN_SENT状态,等待服务器的确认。

第二次握手:服务器接收到客户端发送的数据包,由SYN=1知道客户端请求建立连接的请求,服务器将标志位SYN和ACK都置为1,ack=J+1,随机产生seq=K,并将数据包发送给客户端,表示确认收到客户端建立连接的请求,此时服务器进入SYN_RCVD状态。

第三次握手:客户端收到数据包后,检查ack是否等于J+1,ACK是否等于1,如果都等于,将ack=K+1,ACK=1的数据包发送给服务器,服务器检查ack是否等于K+1,ACK是否等于1。如果都等于则连接建立成功,服务器和客户端都进入ESTABLISHED状态,此时三次握手完成,客户端和服务器之间可以进行数据传输。

为什么需要三次?

为了实现可靠传输,TCP通信的双方都必须维持一个序列号,以标识发送出去的数据那些被收到了。假设序列号为100,发送10byte的数据,接收方接收后回复确认号110=100+10,表示已收到接收方的数据包,下一个数据包从111开始。
如果是两次,最多只有发送方的起始序列号被确认,另一方的选择序列号得不到确认。
如果是四次,三次之后双方已经知道彼此的序列号的起始值,也确认了对方也知道了,第四次就多余了。

SYN洪范攻击

因为服务器在收不到客户端的握手结果就会被拖累,当客户端的第一次握手的IP是伪造的,服务器收到后进行第二次握手,IP是伪造的,数据包发送到其他地方,客户端接收不到,所以第二次握手没有结果,没有结果服务器就会被拖累,死机。使用防火墙即可。

四次挥手

终止TCP连接需要通信双方发送4个数据包才能确认断开,由于TCP是全双工的,所以每一个方向都需要单独关闭。
请添加图片描述

  1. 应用程序调用close,执行主动关闭操作,发送FIN分节,发送完毕后,程序进入FIN_WAIT_1。
  2. 被动关闭端收到数据包后发出确认报文,表示没有额外的数据可以接收,然后进入CLOSE_WAIT状态,处于半关闭状态。主动关闭端收到确认报文后进入FIN_WAIT_2状态。
  3. 一段时间后,被动关闭端调用close关闭自己的套接字,此时也会发送FIN给主动关闭端。
  4. 主动关闭端收到报文后,发送ACK确认报文,然后进入TIME_WAIT状态,此时TCP还没有释放,经过2*MSL时间,也就是两个IP数据报存活最长时间后进入CLOSED状态。
  5. 被动关闭端收到确认报文后立即进入CLOSED状态,同时撤回TCB,所有被动关闭端关闭TCP连接时间要早一些。
    某些情形下,第二步和第三步可以合成一步。

为什么需要四次?

因为是全双工的,通信双方都需要单独关闭。第一次告诉对方我没有数据要发送了,第二次对方说我知道了,第三次对方说我也没有数据要发送了,第四次我知道你也没有数据要发送了。然后双方彻底关闭。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值