刚刚在博客园上看到的一篇文章,觉得写的很有意思,很容易理解,mark上,特生动,原文地址http://www.cnblogs.com/yuilin/archive/2012/11/05/2755298.html
————————————————————————————————————————————————————————————————————————————————————
首先简单介绍一下TCP三次握手
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器 进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED状态,完成三次握手。
通过这样的三次握手,客户端与服务端建立起可靠的双工的连接,开始传送数据。
三次握手的最主要目的是保证连接是双工的,可靠更多的是通过重传机制来保证的。
但是为什么一定要进行三次握手来保证连接是双工的呢,一次不行么?两次不行么?我们举一个现实生活中两个人进行语言沟通的例子来模拟三次握手。
第一次对话:
老婆让甲出去打酱油,半路碰到一个朋友乙,甲问了一句:哥们你吃饭了么?
结果乙带着耳机听歌呢,根本没听到,没反应。甲心里想:跟你说话也没个音,不跟你说了,沟通失败。说明乙接受不到甲传过来的信息的情况下沟通肯定是失败的。
如果乙听到了甲说的话,那么第一次对话成功,接下来进行第二次对话。
第二次对话:
乙听到了甲说的话,但是他是老外,中文不好,不知道甲说的啥意思也不知道怎样回答,于是随便回答了一句学过的中文 :我去厕所了。甲一听立刻笑喷了,“去厕所吃饭”?道不同不相为谋,离你远点吧,沟通失败。说明乙无法做出正确应答的情况下沟通失败。
如果乙听到了甲的话,做出了正确的应答,并且还进行了反问:我吃饭了,你呢?那么第二次握手成功。
通过前两次对话证明了乙能够听懂甲说的话,并且能做出正确的应答。接下来进行第三次对话。
第三次对话:
甲刚和乙打了个招呼,突然老婆喊他,“你个死鬼,打个酱油咋这么半天,看我回家咋收拾你”,甲是个妻管严,听完吓得二话不说就跑回家了,把乙自己晾那了。乙心想:这什么人啊,得,我也回家吧,沟通失败。说明甲无法做出应答的情况下沟通失败。
如果甲也做出了正确的应答:我也吃了。那么第三次对话成功,两人已经建立起了顺畅的沟通渠道,接下来开始持续的聊天。
通过第二次和第三次的对话证明了甲能够听懂乙说的话,并且能做出正确的应答。
可见,两个人进行有效的语言沟通,这三次对话的过程是必须的。
同理对于TCP为什么需要进行三次握手我们可以一样的理解:
为了保证服务端能收接受到客户端的信息并能做出正确的应答而进行前两次(第一次和第二次)握手,为了保证客户端能够接收到服务端的信息并能做出正确的应答而进行后两次(第二次和第三次)握手。
分享到:
相关推荐
TCP三次握手PPT,TCP三次握手,TCP三次握手课件
TCP三次握手,TCP三次握手是TCP连接建立过程的可靠性保证
TCP三次握手与四次挥手.pdf
Wireshark入门 tcp三次握手
三次握手,TCP/IP协议三次握手,TCP/IP协议三次握手
TCP报文分析--三次握手 四次挥手 还介绍了一点 SYN洪水攻击
TCP协议三次握手过程分析
就给出了一张图显示的是TCP三次握手建立、四次握手断开与socket函数对应 如:socket connect()建立对应于SYN ,而connect()返回值 与syn 对应
主要介绍了白话理解TCP为什么一定要进行三次握手,本文用通俗易懂的语言清晰、简洁、有趣的表达了为什么一定要进行三次握手,需要的朋友可以参考下
Socket模拟TCP三次握手,网上找到
TCP三次握手.docx
主要理解三次握手的过程。针对长连接和短连接进行比较
Wireshark抓包分析TCP“三次握手,四次挥手”.doc
使用wireshark抓包分析,并且将特殊字段进行分析。
捕获TCP连接的过程的数据包。 2)分析三次握手建立TCP连接的过程,描述数据包序列图。(包括 SYN标志和SEQ值) 1)检查FTP交互数据报文中用户名和密码是否用明文传送
tcp三次握手过程详细解释
此文的档献给那些不太明白TCP的三次握手,四次断开的鞋同,希望对你们有所帮助
详解TCP三次握手和四次挥手
传输控制协议,TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接,文档介绍TCP三次握手和4次挥手过程以及详细实例介绍,
计算机A首先发送一个syn=1,并随机产生一个Sequence number=xxxxxxxxx(随机)的请求数据包发送给服务器B。当服务器B收到这个请求数据包后由syn=1得知,计算机A要与服务器B建立连接关系。