前两天应老师邀请去创业园听一位学长的分享会,原先是阿里的后来去了58同城,收获不少。期间他问了我们:“BOM是什么?”我说:“浏览器对象模型。”“那你知道怎么用吗?”“我只是听说过,并不了解。”“三次握手四次挥手你知道吗?”“我只是听说过概念,具体不大清楚。”他笑了:“很多人都只是知道听说过而已,但是并不了解,也不会用,就这样在面试中pass掉了。”
他的话对我触动很大,确实如此,作为一个学东西比较杂的人,我确实很多概念都知道,但具体确不清楚,这样是一种十分危险的情况,我虽然早有意识,但是没有意识到其中的严重性,于是痛下决心,一定要抓一门重点。
以上经历,大家自行体会,下面进入正题。
关于TCP/IP协议相信大家早有耳闻,今天来说一下经典的三次握手和四次挥手。
顾名思义,三次握手是在客户端和服务器连接的时候具体情况进行的拟人化表述,四次挥手就是断开连接的时候了,具体过程如下。
先上几个名词:
tcp:transmission control protocol(传输控制协议)
SYN:synchronous,表示建立连接
ACK:acknowledgement,确认,表示响应
PSH:push 表示有data数据的传送
FIN:finish 结束,即关闭连接
RST:reset 重置
URG:urgent 紧急
Sequence number:顺序号码
Acknowledge number:确认号码
三次握手:
1,client发送SYN=1,随机产生seq=m的数据包到server,并进入SYN_SENT状态,server发现SYN=1,知道client要建立连接。
2,server要发 送确认信息,向client发送ack number(m+1),SYN=1,ACK=1,以及自己随机产生的seq=n,并进入SYN_RCVD状态。
3,client检查ack number是否正确,以及ACK=1,如果正确,则发送ack number(n+1)和ACK=1,server收到后确认seq和ACK=1,确认后则连接成功,双方进入ESTABLISHED状态。
听起来有点晕,没错,我开始查资料的时候也是一头雾水,而且说法也不大一样,有的仅仅是一个非常简单的图示,这也是我想写这个手记的原因。下面是自己手画的一个示意图,希望能帮助大家理解。
这张图片是我看了很多参考之后画的,绝对没有问题,大家可以放心去看。
四次挥手
1,client发送一个FIN=1,和一个seq=m,用来关闭和server的数据传输,并进入FIN_WAIT_1的状态。(注意:这里client发出FIN,只是代表client不会向server传送数据,但是server依然可以向client传送数据)
2,server收到FIN之后,发送一个ACK=1加上m+1到client,并进入CLOSE_WAIT状态。
3,server发送一个FIN=1加上一个seq=k到client,用来关闭和client的数据传输,并进入LAST_ACK状态。
4,client收到FIN后,发送ACK=1加上k+1到server,并进入TIME_WAIT状态,server收到后进入CLOSED状态,双方连接关闭。
图示如下
这张图我不敢保证是不是完全正确,因为我没有找到靠谱的图片具体指明参数是怎样传递的,所以自己分析了一下,得到了这张图片,如有指正,欢迎大家留言讨论,感激不尽。
小问题:为什么连接的时候要三次断开的时候要四次呢?
因为在建立连接的时候,server收到了client的连接请求,然后通知client表示自己可以进行连接,此时SYN和ACK是同时发出的,clien收到响应之后,再次向server发出确认信息,然后双方进行连接。
但是在断开的时候呢,client发现自己没有数据向server传输,于是向server提出请求断开连接,这时候会出现什么情况呢?很有可能就是server发现自己向client的数据没传完,于是发出信息:“收到你的信息,但是请等一下”。等到传完了信息,server又发信息:“我准备好了,可以断开了”。然后客户端发信息表示自己收到了信息,此时才可以放心的断开连接,不会丢失数据。这时候FIN和ACK就不是同时发出的,而是分两次发出的。(注意:这里说的client和server只是为了便于表述,实质上双方均可以提出关闭请求,无所谓先后顺序。)
这篇文章写得不错,很具体,但是图示看起来有点费解,而且觉得不大对,仅供参考吧!我是链接
最后欢迎大家批评指正啊!
热门评论
在四次挥手最后一步的时候,client传给server应该是ack=k+1而不是seq吧