TCP的三次握手与四次握手过程及状态转换
2016-02-11 17:51
435 查看
这是个网络编程面试的重点知识点,总结一下:
所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个数据包。
三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息。
在socket编程中,服务器首先调用socket、bind、listen和accept,并阻塞于accept,当客户端调用connect时,将触发三次握手过程。
第一次握手:客户端调用connect发送一个SYN数据包给服务器,并进入SYN_SENT状态,等待服务器的确认;
第二次握手:服务器收到客户端发来的SYN数据包,必须发回确认包(ACK)应答,同时自己也发送一个SYN包给客户端,此时服务器进入SYN_RCVD状态;
第三次握手:客户端收到服务器的数据后connect返回,进入ESTABLISHED状态,并向服务器发回确认包ACK,服务器接收到这个ACK后accept返回,也进入ESTABLISHED状态。
至此,三次握手完成,服务器和客户端就建立起了连接。上述过程图示如下:
第一次握手:客户端或服务器调用close发起主动关闭,我们以客户端为例,客户端发送一个FIN给服务器,并进入FIN_WAIT_1状态;
第二次握手:服务器收到FIN后发送一个确认包ACK到客户端,并进入CLOSE_WAIT状态,客户端接收到ACK后进入FIN_WAIT_2状态;
第三次握手:经过一段时间,服务器做好了关闭连接的准备工作,然后调用close(代码主动调用或由内核调用)给客户端发送一个FIN,并进入LAST_ACK状态;
第四次握手:客户端收到服务器的FIN后发送ACK给服务器,然后进入TIME_WAIT状态,服务器接收到这个ACK后进入CLOSED状态。
至此四次握手完成,客户端与服务器间的连接被终止,图示如下(左边client,右边server):
建立连接——三次握手
TCP通过三次握手建立服务器与客户端之间的连接。所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个数据包。
三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息。
在socket编程中,服务器首先调用socket、bind、listen和accept,并阻塞于accept,当客户端调用connect时,将触发三次握手过程。
第一次握手:客户端调用connect发送一个SYN数据包给服务器,并进入SYN_SENT状态,等待服务器的确认;
第二次握手:服务器收到客户端发来的SYN数据包,必须发回确认包(ACK)应答,同时自己也发送一个SYN包给客户端,此时服务器进入SYN_RCVD状态;
第三次握手:客户端收到服务器的数据后connect返回,进入ESTABLISHED状态,并向服务器发回确认包ACK,服务器接收到这个ACK后accept返回,也进入ESTABLISHED状态。
至此,三次握手完成,服务器和客户端就建立起了连接。上述过程图示如下:
终止连接——四次握手
TCP通过四次握手终止服务器与客户端之间的连接,一共需要发送四个数据包。第一次握手:客户端或服务器调用close发起主动关闭,我们以客户端为例,客户端发送一个FIN给服务器,并进入FIN_WAIT_1状态;
第二次握手:服务器收到FIN后发送一个确认包ACK到客户端,并进入CLOSE_WAIT状态,客户端接收到ACK后进入FIN_WAIT_2状态;
第三次握手:经过一段时间,服务器做好了关闭连接的准备工作,然后调用close(代码主动调用或由内核调用)给客户端发送一个FIN,并进入LAST_ACK状态;
第四次握手:客户端收到服务器的FIN后发送ACK给服务器,然后进入TIME_WAIT状态,服务器接收到这个ACK后进入CLOSED状态。
至此四次握手完成,客户端与服务器间的连接被终止,图示如下(左边client,右边server):
相关文章推荐
- IOS-网络(文件压缩和解压缩)
- 【HTTP协议系列2】User-Agent的历史
- Alex-Word-Filter-MFC网络版(修正版)
- HTTP与HTTPS握手的那些事
- HTTP与HTTPS握手的那些事
- http.client模拟登陆
- 软考嵌入式系统工程师知识点整理(网络与通信)
- 【HTTP协议系列1】Chrome浏览器查看http头
- freemodbus modbus TCP 学习笔记
- File Upload using jQuery AJAX in ASP.NET Web API or Http handler (AJAX上传文件通过Web API或 http handler)
- okhttp 使用学习
- servlet、genericservlet、httpservlet之间的区别(转)
- 网络广告商的像素追踪是如何工作的?
- 微信https_request
- HTTP与HTTPS握手的那些事
- 来,让我们写一个网络爬虫,下载页面上所有的照片吧!
- 安卓日记——利用http上传文件到服务器
- Python网络爬虫(三):连续爬取百度百科词条数据
- 9.1、神经网络实例
- 9、神经网络