码迷,mamicode.com
首页 > 其他好文 > 详细

Tcp三次握手

时间:2016-07-12 17:06:59      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:

我也不是通信专业的专业学生,只是作为计算机学科的必修课程学了计算机网络,一开始本来还觉得这东西没啥必要学的,因为我毕业可能从事前端方面的工作,后来才发现这门课其实挺好玩的。除了了解多一点有关于网络性能方面的东西,也可以了解很多攻击的原理,虽然我还是不会怎么攻击。仅希望可以攒一下人品,毕竟。。。这老师平均分才36....
好了,切回正题。这只是我的一个学习笔记,可能东西并不是很准确,希望大神们加以指导。谢谢啦。

众所周知,运输层两个主要的协议,一个是面向数据报文的UDP,另一个是面向连接的TCP。
三向握手和四次挥手就是TCP运输连接其中的两个阶段,建立连接和释连接。

建立连接的阶段,需要明确的三个问题,也是必须解决的三个问题;
1.让每一方都知道对方的存在,如客户端和服务器端的双方都要知道对方的存在。
2.允许对方协商一些参数,比如你希望我为你提供多大的窗口值,也就是一次可以发多少东西给你。
3.能够对运输实体资源进行分配,比如缓存的大小等等。

现在以浏览器访问一个网站为例解释一下。
比如我(客户端)想要访问www.baidu.com,现在是假设的情况是我经常访问这个百度网站,不然可能要涉及建立连接前的各种解析域名的步骤。。。我懒。。不扯太多了。

技术分享


首先明确一下TCP的首部结构是如上图所示:
序号(seq)是自己这个报文所发出的数据的第一个字节的序号。
确认号(an),是期望对方发过来的第一个字节的序号,如果AN=k,则说明对方发过来的k-1数据已经接受到了。
syn=同步位;
ack=确认,当ack=0时,这个确认号无效。当且仅当ack=1时才有效。
我已知了你的服务器的ip地址,我现在想要请求你的资源,首先,我需要和你打一个招呼,告诉你,我想要你的东西,我需要知道你在不在。现在,我就是主动发起连接请求,服务器就是需要被!打开的一方。

第一次找你,第一次握手:我(客户)发出建立连接的请求报文段。现在我发出的一个带有syn(同步位)的包,syn一般是为1,一般syn设置为1表示这是一个请求连接或者接受请求的报文,seq(初始序号)=x,这表示自己选择的下一个初始序号为seq=x+1;
总结:syn=1;seq=x;这时候客户端也进入了syn_send的状态啦

第二次握手:此时服务器已经收到了我的请求报文段,就需要回复一个响应我的请求的确认报文段,这时候,服务器就会发一个syn=1;ACK=1;seq=y(响应报文段的发送序号);an=x+1
这表明服务器已经接受到你的请求了,也同意的你请求了。就有点类似于,我打电话和你说我要管你借东西,你说可以啊,你这个[可以啊]就成为了第二次握手了。总的来说第二次握手的表明服务器同意啦!这时候服务端也进入了syn_rcvd的状态啦

我在复习的时候,遇到一个问题,为什么还要建立第三次握手,明明服务器同意啦,为什么还要多此一举。其实这并不是多此一举,其实这时候客户端接受到了服务器端的确认请求的报文段,已经准备好了,但是服务器端不知道啊,就像A和B说我要借你的东西,你给我送过来吧,B说好啊,然后挂机。
B不知道A什么时候准备好在家等他,而B又一直在等A拿东西给他,彼此都在等待,这时候如果没有一个人先打破这个死循环,就会变成死锁,就会无限制的等待下去。这是不可以的!第三次握手就是为了要避免这种情况,当客户端返回第三个确认报文段的时候,说明客户端已经完成了准备工作,服务器端可以发送数据了。
第三次握手:这是连接建立前的最后一次。此时的客户端在收到第二次握手的时候,就进入了established的状态,表示连接已经建立,但是客户端需要发送一个确认包告诉服务器端[我已经准备好了]。所以,这时候我就发送了一个带有ack=1;an=y+1;的包告诉服务器端。服务器端在收到这次之后,也会进入到established的状态,这时候连接就正式建立啦~~

三向握手其实也是可以用来攻击的。。。我想了想。。。如果我向服务器端请求,但是我又不给他发确认。。。服务器可以处于syn_rcvd的状态一段时间?只要我速度够快,包够多,不就可以占用它。。。让他永远处于那个状态?

 

Tcp三次握手

标签:

原文地址:http://www.cnblogs.com/Uni-Chan/p/5664073.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!