TCP为什么是3次握手而不是2次或者4次或者更多次?
2016-07-23 16:06
423 查看
TCP建立连接过程如图:
客户端发出段1,SYN位表示连接请求。序号是1000,之后每发一个数据字节,这个序号要加1,这样在接收端可以根据序号排出数据包的正确顺序,防止丢包的现象。mass表示最大尺寸,若一个段太大,封装成帧后超过了链路层的最大帧长度,就必须在IP层分片,为了避免这种情况,客户端声明自己的最大段尺寸,建议服务器端发来的段不要超过这个长度。
服务器发出段2,也带有SYN位,同行置ACK位表示确认,确认序号为1001,表示“接收到序号1000以及之前所有的段,请下次发送序号为1001的段”,也就是答应了客户端的连接请求,同时给客户端发出一个连接请求,同时声明最大尺寸为1024.
客户端发出段3,对服务器的连接请求进行应答,确认序号为8001.
以上过程称为“三次握手”
为什么不能建立两次握手、四次或者多次呢?
如果是两次握手,首先client给server发送了一个连接请求,server收到了这个请求并且发送了一个确认应答的请求,站在server的角度,它认为连接已经建立成功了,开始发送数据。但是此时client并没有得到响应,它会认为连接还没有建立成功,将忽略server发送的数据,这样server在发出的数据超时后,会重复的发送数据,就形成了死锁的情况。所以两次握手显然不行。
超过三次以上其实都可以,但是三次刚好可以完全建立连接,四次或者多次效率会低点。所以TCP建立连接采用“三次握手”。
客户端发出段1,SYN位表示连接请求。序号是1000,之后每发一个数据字节,这个序号要加1,这样在接收端可以根据序号排出数据包的正确顺序,防止丢包的现象。mass表示最大尺寸,若一个段太大,封装成帧后超过了链路层的最大帧长度,就必须在IP层分片,为了避免这种情况,客户端声明自己的最大段尺寸,建议服务器端发来的段不要超过这个长度。
服务器发出段2,也带有SYN位,同行置ACK位表示确认,确认序号为1001,表示“接收到序号1000以及之前所有的段,请下次发送序号为1001的段”,也就是答应了客户端的连接请求,同时给客户端发出一个连接请求,同时声明最大尺寸为1024.
客户端发出段3,对服务器的连接请求进行应答,确认序号为8001.
以上过程称为“三次握手”
为什么不能建立两次握手、四次或者多次呢?
如果是两次握手,首先client给server发送了一个连接请求,server收到了这个请求并且发送了一个确认应答的请求,站在server的角度,它认为连接已经建立成功了,开始发送数据。但是此时client并没有得到响应,它会认为连接还没有建立成功,将忽略server发送的数据,这样server在发出的数据超时后,会重复的发送数据,就形成了死锁的情况。所以两次握手显然不行。
超过三次以上其实都可以,但是三次刚好可以完全建立连接,四次或者多次效率会低点。所以TCP建立连接采用“三次握手”。
相关文章推荐
- TCP版backshell的VBS脚本代码
- 为什么 Windows2003 的 IIS6.0 不能上传超过 200K 的文件?
- 使用C语言编写基于TCP协议的Socket通讯程序实例分享
- TCP Wrappers防火墙介绍与封锁IP地址的方法
- c语言多进程tcp服务器示例
- win2003连接限制TCP连接限制
- PowerShell脚本开发之收发TCP消息包
- Nodejs创建TCP服务器 - king0222
- C#实现TCP连接信息统计的方法
- linux shell 脚本实现tcp/upd协议通讯(重定向应用)
- 使用C#实现基于TCP和UDP协议的网络通信程序的基本示例
- Android使用socket创建简单TCP连接的方法
- Android实现TCP客户端接收数据的方法
- Android TCP 文件客户端与服务器DEMO介绍
- Android中实现TCP和UDP传输实例
- python实现可将字符转换成大写的tcp服务器实例
- php实现TCP端口检测的方法
- Java Socket编程实例(一)- TCP基本使用
- Java Socket编程实例(三)- TCP服务端线程池
- Java实现Socket的TCP传输实例