计算机网络③-②:TCP头格式、三次握手、四次挥手、TCP状态机

TCP头格式

TCP有六个状态位:
SYN(Synchronize Sequence Number,同步序列编号):用于发起一个连接。
ACK(Acknowledgement):用于回复
RST(Reset):用于重新连接
FIN(Finish):用于结束连接
PSH(Push):推送比特
URG(Urgent):紧急

TCP连接的建立过程:三次握手

  理解三次握手,要明白一个现实,就是网络是不可靠的。终究TCP包是要被封装在IP包中的,IP传输本身就是不可靠的,TCP协议要想可靠,只有一个办法,重传。

  A要和B建立连接,发送一个建立连接的请求,如同“你好”,B如果收到了“你好”,也应该回复A“你好”。B的回复是必须的,否则,A不知道B是否可达,或者B是否愿意建立这个连接。当A收到B回复的“你好”的时候,A就可以确认它的包B能收到,并且B的包它也能收到,就可以认为连接已经建立好了,但是此时B并不知道A是否能收到它的回答,所以此时B还不能认为连接建立好,需要A再次告诉B,”我已经收到了你的回复”。这样A-B, B-A, A-B,就构成了3次握手。
  简而言之,A和B都要确认自己发出去的信息能被对方收到。
在这里插入图片描述

  1. 一开始两端都处于CLOSED状态,B是服务端需要监听端口,监听后变成LISTEN状态。
  2. A发送一个SYN(你好)后状态变为SYN-SENT。
  3. B收到SYN后状态由LISTEN变为SYN-RCVD。给A回一个SYN,ACK(回复你好)。
  4. A收到这个SYN,ACK后状态变为ESTABLISHED,然后给B回ACK
  5. B收到ACK后状态变为ESTABLISHED,连接建立完毕。


三次握手除了建立连接,还沟通了TCP包序号的问题。
  ①A和B要告诉对方,包的序号从几号开始:A第一次发seq=x,第二次发seq=x+1;B第一次发seq=y。
  ②每次连接都要有不同的序号(避免某个包绕路后冲突),其实序号随时间变化,因为这个32位计数器要4个小时才会重复,超过了IP包头里的生存时间值(TTL)。


TCP连接断开的过程:四次挥手

断开连接因为涉及到数据的完整性,因此比建立连接要复杂。

一个正常的流程就是A和B说:“我没事儿了”,B回复一个“我知道了”,然后B对A说“我也没事儿了”,A说“我知道了”。A-B,B-A,B-A,A-B,四次挥手。
在这里插入图片描述

  1. A给B发送 “FIN”请求 后进入FIN_WAIN_1。
  2. B收到A的消息后,发送 “ACK”应答 后进入CLOSED_WAIT状态。这里B不能直接发送“FIN”,因为B可能还要处理未完成的事情,例如Buffer中的数据。
  3. A收到B的“ACK”应答后进入FIN_WAIT_2状态,如果此时B直接跑路,A将永远处于这一状态。(Linux系统设置了tcp_fin_timeout这个参数,设置了一个超过时间,可以处理该问题)。
  4. B发送“FIN”请求后进入LAST_ACK状态,A收到后发送“ACK”应答,要进入TIME_WAIT状态。A这个时候不能直接CLOSED, 因为要确保B能收到这个ACK。

问题1:为什么TIME_WAIT状态为2MSL
2MSL的两个理由
2MSL 的时间是从客户端接收到 FIN 后发送 ACK 开始计时的。如果在 TIME-WAIT 时间内,因为客户端的 ACK 没有传输到服务端,客户端又接收到了服务端重发的 FIN 报文,那么 2MSL 时间将重新计时。

理由① TIME_WAIT状态为2MSL可以保证最糟糕情况也可以收到超时重传的FIN。客户端发出ACK,最多经过MSL服务端还没收到,这时服务端会再发一个FIN,最多经过MSL再次到达客户端,所以2MSL保证可以接收到服务端重新发送的FIN;
time = 0,客户端发出ACK
time = 最大为MSL,服务端重发FIN
time = 最大为2MSL,FIN到达客户端。

理由② 保证当成功建立一个TCP连接的时候,来自连接先前化身的重复分组已经在网络中消逝。个人理解:
time = 0,客户端发出ACK
time = MSL-1,服务端重发FIN
time = MSL,ACK消失
time = 2MSL - 1,FIN消失。
所以即便服务端重发的FIN不能到达客户端,2MSL也能保证所有前一个连接的包在网络中消失。加入新的连接采用相同的IP地址和端口号也不会影响

问题2:如果客户端第四次挥手ack丢失,服务端超时重发的fin报文也丢失,客户端timewait时间超过了2msl,这个时候会发生什么?认为连接已经关闭吗?”
当客户端 timewait 时间超过了 2MSL,则客户端就直接进入关闭状态。
服务端超时重发 fin 报文的次数如果超过 tcp_orphan_retries 大小后,服务端也会关闭 TCP 连接。

TIPS:
  ① A的TIME_WAIT设定为2MSL,MSL(Maximum Segment Lifetime,最长生存时间)是包在网络上生存的最长时间,超过这个时间的包将被丢弃。协议规定MSL为2分钟,实际常用为30s,1min,2min等。
  ②TCP包是基于IP的,而IP头中有一个TTL域,该字段用来表示IP数据包可以经过的最大路由数,每经过一个处理它的路由器此值就减1,当此值为0时,数据包就会被丢弃,同时会发送ICMP包通知源主机。

TCP状态机

在这里插入图片描述

③-②小结:
  ①TCP头很复杂,但是主要关注五个方面:顺序问题、丢包问题、连接维护、流量控制、拥塞控制。
  ②连接的建立要经过三次握手,断开要经过四次挥手。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值