这个问题困扰我许久,我也不明白为啥,明明就这么点东西,但是我死活弄不好。
今天我就花点时间,把我想要的总结一下然后再去理解记忆。
(好吧,其实我上次就打算花一下午的时间来做这个事,但是不知道怎么开始。)
1、理解三次握手,四次挥手。
三次握手(你可以理解成两个人打电话)
A:喂,你能听到嘛?
B:我听到了,你能听到嘛?
A:我听的到
经过上面三个步骤后,A和B就可以开始说这次打电话的目的了。
四次挥手(同样理解成打电话)
A:我妈回来了,我不能说了
B:好吧,我知道了
B:我爱你噢
A:爱你么么哒!
经过上面四个步骤,A和B才可以挂了电话。
当然如果你厌倦了你的女朋友你完全可以这样。
A:我妈回来了,我不能说了
A:嘟嘟嘟…(B当场挂掉电话)
2、和面试官谈三次握手,四次挥手。
三次握手: 客户端发送SYN数据包到服务端请求连接,服务端返回SYN/ACK数据包。客户端再次发送ACK数据包。经过三次只会客户端和服务器都可以确定自己接收发送正常,对方接收发送正常,这时就可以进行通信了。
四次挥手: 任何一端都可以主动提出终止连接,然后另外一端确认。但是另外一端可能还有数据没有发送完,这时候等到发送完毕后告诉对方可以关闭了。对方这时候才进行关闭。(提出关闭的一方发送FIN数据包,另一方确认收到回复ack,等待数据发送完毕,再发送FIN,这时提出关闭的一方回复ack完成关闭。)
3、手绘三次握手,四次挥手。
手绘之前,我们需要搞懂它里面的字符都是什么意思,记下来了就简单了
mmp,我以前能手绘的,过了一段时间没想到忘记的透透的…
字符 | 意义 |
---|---|
序列号seq | 占4个字节,用来标记数据段的顺序 |
确认号ack | 占4个字节,期待收到对方下一个报文段的第一个数据字节的序号 |
确认ACK | 占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效 |
同步SYN | 连接建立时用于同步序号 |
终止FIN | 用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接 |
ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。
三次握手图
四次挥手图
4、相关的问题
Q:为什么必须三次连接两次行不行?
A:不行,因为TCP是安全的传输,必须保证每一个数据包都不丢失。所以必须保持客户端和服务端都接收、发送正常。
Q:为什么必须四次挥手关闭?
A:因为被动关闭的一方,可能存在没有发完的数据,等它发送完毕后还需要再次告诉一下关闭方,这样关闭方才可以进行确认关闭。
Q:为什么必须四次挥手关闭?
A:客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
如果对你有帮助可以关注我的公众号噢,一个胡扯的公众号:小道仙97