关于TCP的三次握手建立连接
2015-12-16 17:08
513 查看
先讲理论
我们知道TCP建立连接需要采用3次握手,如下图所示(该图来自TCP/IP协议族第4版)(这幅图作者可能有个笔误,下面会讲):
可以看到三次握手之前服务器端有个被动打开,这应该是服务器的准备过程,使它能够接受客户端的TCP连接。
下面开始三次握手的过程。
在上图中首先客户端发送一个SYN报文作为同步序号(synchronization)来确保客户端和服务器端的通信按次序传输,同时有一个序号seq(在TCP连接中传送的字节流中的每一个字节都按顺序编号,SYN报文段虽然不携带任何数据,不过还是会消耗一个序号)。
服务器端收到这个报文后返回一个SYN+ACK报文,其中SYN是服务器用来同步它的初始序号的,ACK(acknowledgement)告诉客户端它收到了客户端发来的SYN报文,同时ack = seq+1(表示它希望收到对方下一个报文段的第一个数据字节的序号),并且也产生了一个序号seq。可以看到还有一个接受窗口(rwnd)值,这个值用来告诉对方,从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量,有时间写篇流量控制的文章再详细说这个问题。
最后客户端发送ACK报文段,通过ACK标志和确认号字段ack(客户端) = seq(服务器端) + 1来告诉服务器收到了服务器的报文段。不过可以看到上图中seq还是8000,应该有问题,因为SYN报文段消耗了一个序号了,我查了些其它书,都是加了1的,所以这应该是作者的笔误。 rwnd值含义同上。
理论讲完了。。下面眼见为实。。我们来抓个包。
可以看到第一个报文段的seq = 0,第三个报文段的seq = 1,也验证了应该加1的说法。
现在我们可以考虑下为什么要三次握手吧。。。
可以想象下两个人站在一条河的两岸,他们要进行通信,一般的过程是怎么样的?
小王问小明:小明,你听得到我说话吗?
小明回答:我听得到,那你听得到我说话吗?
小王回答:我也听得到。
这样可以可以保证A->B以及B->A的通信线路都没问题。
还看到个原因是第三次的确认可以避免下面这种情况,A发送了个连接请求报文段给B,不过因为一些原因,这个报文段在路上滞留了,根据超时重传,A又重传了一次连接请求,并顺利建立了连接,不过后来那个滞留的报文段又传到了B,如果只用两次握手,B发了个ACK + SYN给A,连接就建立了,然后B在那苦等A那根本不会来的数据,白白浪费了资源,而三次握手就可以解决这个问题,因为在这种情况下A不会发ACK报文给B,连接就无法建立。
我们知道TCP建立连接需要采用3次握手,如下图所示(该图来自TCP/IP协议族第4版)(这幅图作者可能有个笔误,下面会讲):
可以看到三次握手之前服务器端有个被动打开,这应该是服务器的准备过程,使它能够接受客户端的TCP连接。
下面开始三次握手的过程。
在上图中首先客户端发送一个SYN报文作为同步序号(synchronization)来确保客户端和服务器端的通信按次序传输,同时有一个序号seq(在TCP连接中传送的字节流中的每一个字节都按顺序编号,SYN报文段虽然不携带任何数据,不过还是会消耗一个序号)。
服务器端收到这个报文后返回一个SYN+ACK报文,其中SYN是服务器用来同步它的初始序号的,ACK(acknowledgement)告诉客户端它收到了客户端发来的SYN报文,同时ack = seq+1(表示它希望收到对方下一个报文段的第一个数据字节的序号),并且也产生了一个序号seq。可以看到还有一个接受窗口(rwnd)值,这个值用来告诉对方,从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量,有时间写篇流量控制的文章再详细说这个问题。
最后客户端发送ACK报文段,通过ACK标志和确认号字段ack(客户端) = seq(服务器端) + 1来告诉服务器收到了服务器的报文段。不过可以看到上图中seq还是8000,应该有问题,因为SYN报文段消耗了一个序号了,我查了些其它书,都是加了1的,所以这应该是作者的笔误。 rwnd值含义同上。
理论讲完了。。下面眼见为实。。我们来抓个包。
可以看到第一个报文段的seq = 0,第三个报文段的seq = 1,也验证了应该加1的说法。
现在我们可以考虑下为什么要三次握手吧。。。
可以想象下两个人站在一条河的两岸,他们要进行通信,一般的过程是怎么样的?
小王问小明:小明,你听得到我说话吗?
小明回答:我听得到,那你听得到我说话吗?
小王回答:我也听得到。
这样可以可以保证A->B以及B->A的通信线路都没问题。
还看到个原因是第三次的确认可以避免下面这种情况,A发送了个连接请求报文段给B,不过因为一些原因,这个报文段在路上滞留了,根据超时重传,A又重传了一次连接请求,并顺利建立了连接,不过后来那个滞留的报文段又传到了B,如果只用两次握手,B发了个ACK + SYN给A,连接就建立了,然后B在那苦等A那根本不会来的数据,白白浪费了资源,而三次握手就可以解决这个问题,因为在这种情况下A不会发ACK报文给B,连接就无法建立。
相关文章推荐
- iOS开发网络缓存原理
- C++ http fileserver 开发手记
- Linux 基于openssl的https服务配置
- TcpListener的异步调用内存泄漏---最近测试结果,没有泄露
- Linux web服务与HTTP协议基础概念
- [第三方]SDWebImage获取网络图片控件的用法
- 老李分享:HTTP session原理及应用 3
- 老李分享:HTTP session原理及应用 2
- 老李分享:HTTP session原理及应用 1
- 网络编程部分案例总结
- 用CornerStone配置SVN,HTTP及svn简单使用说明
- spring企业级应用http://zz563143188.iteye.com/blog/1825168
- CNN卷积神经网络应用于人脸识别(详细流程+代码实现)
- 网络请求 ---iOS
- 小记:加载网络图片返回字节数组。
- 十大免费又好用的网络分析工具
- iOS9 HTTP 不能正常使用的解决办法
- 浅析计算机网络(1) -- 主机如何上网
- http meta
- 浅析计算机网络(2) -- DNS工作原理