TCP 三次握手机制
2015-09-10 14:59
399 查看
tcp为什么要第三次握手,time_wait是做什么的?
tcp有几种状态,画出所有的状态转换图。
晚上看到的面试题,TCP三次握手的印象很深,但为什么需要3次握手,还是想不起来了。简单而言:如果不是三次握手的话,那么到底需要几次握手最佳呢?2次握手,或者4次以上的握手?
先看2次握手的情况:客户端给服务器发送建立连接的请求,服务器同意连接请求发回应给客户端,连接就此建立。
有问题的就是网络中经常会出现的包的延迟,如果客户端的某个包在路由器上延迟了,过了很久才发给服务器,服务器收到这个包后回应给客户端,服务器以为连接就此建立成功,分配资源,这样就会出现问题。
再看四次握手的情况:
①A发送SYN,
②B收到SYN后发送ACK+SYN
③A发送ACK
④B再发送ACK
实际上这样的过程可以一直循环下去,其实3次握手已经是能够使双方知道对方设备都是好用的最少次数。四次握手会浪费资源。
综上所述,TCP 3次握手最好。
下面是第二个问题:time_wait是做什么的?
假设客户端发送的最后一个ACK丢失了,服务器会重发它发送的最后一个FIN,所以客户端必须维持一个状态信息,以便能够重发ACK;如果不维持这种状态,客户端在接收到FIN后将会响应一个RST,服务器端接收到RST后会认为这是一个错误。如果TCP协议能够正常完成必要的操作而终止双方的数据流传输,就必须完全正确的传输四次握手的四个节,不能有任何的丢失。这就是为什么socket在关闭后,仍然处于
TIME_WAIT状态,因为他要等待以便重发ACK。
相关文章推荐
- 【网络流】【1010】【棋盘加数】
- 【网络流】【1010】【棋盘加数】
- HttpClient封装POST,GET方式HTTP请求
- 网络编程
- 传输层(3)-缓冲区大小及限制、TCP输出
- 使用NetHogs监控进程网络使用情况
- 怎样使用C语言程序获取Linux系统中未使用的内存大小? http://linux.cn/thread-13774-1-1.html
- Linux系统内存监控全面讲解:free命令 http://os.51cto.com/art/201004/193160.htm
- HTTP 文件下载时中文文件名乱码问题处理
- 《TCP/IP详细说明》读书笔记(17章)-TCP传输控制协定
- UBuntu经常使用的操作(网络资源)
- httpServletRequest对象、filter、servlet、servlet容器、catalina、tomcat、以及web容器之间的关系
- Linux环境下,web工程基于httpd和tomcat的集群部署
- Caffe学习:使用pycaffe绘制网络结构
- IOS网络第一天 - 02SDWebImage
- C++用法的学习心得(要求包含示例,并反映出利用网络获取帮助的过程)
- IOS网络第一天-01基本的HTTP请求
- C#网络编程
- 同步与异步访问网络
- Java HTTPS客户端如何处理证书