【网络原理】TCP/IP 协议—— 传输层(三)三次握手与四次挥手

连接管理机制 - TCP 的可靠性为基础

在正常情况下,TCP要经过三次握手建立连接,四次挥手断开连接。

面试题:

(1)为什么需要 TCP 连接?  因为这套机制是以不同五元组描述的通道分别管理的。

(2)什么是连接(Connection)?抽象层面上:五元组唯一标识的一条通信通道。

OS 层面上:一个 Connection 对象,描述五元组信息 + 各种管理信息(SN/ASN + 缓冲区信息)。OS 通过 List / Map 把 Connection 对象组织起来。

(3)建立连接的目的:同步 ISN

(4)初始序列号为什么是随机的?如果是确认的,就不需要同步,并且有可能会被伪造 segment 攻击。

 

Socket 和连接的关系-从应用层代码角度理解:

什么是套接字:OS 提供的用于应用层和网络协议栈进行通信的一套标准接口。

三次握手建立 TCP 连接(TCP协议栈视角)

  • SN :序列号。初始序列号是随机生成的,之后的通信以此为基础。因为
  • ASN:确认序列号(SN + 数据长度)。第一次 ASN 不带有效负荷,没有什么要应答的,因此 ASN = 0 。
  • 标志位 SYN:表示想建立连接,进行信息的同步。(将自己的序列号告诉对方,长度视为 1,因此对方的确认序列号应该加1 )
  • 标志位ACK:确认应答用的,表示确认之前收到的 segment,配合确认序列号(ASN)使用。空的 ACK 不需要再次应答

过程解释:

1、Client --- > Server :客户进程发出连接请求报文段,此时随机生成一个初始序列号 ISN = x ,并且 SYN 置为 1,ASN = 0 ,ACK = 0。客户端状态由 CLOSED -> SYN_SENT(同步发送)

2、Server ---> Client :服务进程收到客户进程发来的报文,如果同意连接,选择一个初始序列号 ISN = y,确认序列号为 ASN = x + 1,且SYN = 1,ACK = 1。服务端状态进入 SYN_RCVD(同步接收)

3、Client --- > Server:客户进程收到服务进程的响应,再次做出应答,发送 SN = x + 1,ASN = y + 1,SYN = 0,ACK = 1。此时客户端状态进入ESTABLISHED(已建立连接)状态,若服务端收到确认报文,则也进入 ESTABLISHED 状态。

练习理解:

状态转换与应用层代码结合:

面试题:

1.为什么是三次?三次刚好满足需求

2.为什么不能两次?Client 发 SYN,Server 回 ACK,Server 发 SYN,Client 回 ACK。如果没有最后一步,那么服务器端就不知道客户端是否收到数据,就会触发超时重传机制,一直重传。即不满足确认应答。

3.为什么不是四次?能少尽量少,因为 Server 回 ACK 和 Server 发 SYN 肯定是同时的,所以合并了。

四次挥手释放 TCP 连接

A 结点 和 B 结点(没有客户端服务器之说)

为什么是TIME_WAIT的时间是2MSL?

MSL是TCP报文的最大生存时间,因此TIME_WAIT持续存在2MSL的话,就能保证在两个传输方向上的尚未被接收或迟到的报文段都已经消失(否则服务器立刻重启, 可能会收到来自上一个进程的迟到的数据,但是这种数据很可能是错误的);同时也是在理论上保证最后一个报文可靠到达(假设最后一个ACK丢失, 那么服务器会再重发一个FIN。这时虽然客户端的进程不在了,但是TCP连接还在,仍然可以重发LAST_ACK)。

CLOSE_WAIT

一般而言,对于服务器上出现大量的 CLOSE_WAIT 状态,原因就是服务器没有正确的关闭 socket,导致四次挥手没有正确完成。 这是一个 BUG。只需要加上对应的 close 即可解决问题。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值