TCP建立连接与断开连接的过程

在CS模式的TCP连接建立过程中,客户端与服务器端流程如下:

客户端流程:发送请求->接收服务器端确认->发送对服务器端确认的确认。

服务器端流程:接收客户端的连接建立请求->发送确认->接收客户端发送的对确认的确认。
在这里插入图片描述
1、刚开始客户端和服务端都处于CLOSED状态,服务端开始监听某个端口,进入LISTEN状态。

2、客户端发送连接请求报文,其中包含SYN=1,ACK=0,初始序列号x,进入SYN-SENT状态。

3、服务器端接受请求报文后,向客户端发送确认报文,其中包含SYN=1,ACK=1,确认号x+1,自己的初始序列号y,之后服务器会进入SYN-RCVD状态。

4、客户端收到 服务器端的确认报文后,会发送一个确认报文给服务器,表明已经接收到服务器发送的确认报文。该报文中包含ACK=1,确认号y+1,序列号x+1。同时客户端会进入ESTABLISHED状态。

5、服务器收到上述报文后会进入ESTABLISHED状态。此时客户端与服务器的TCP连接建立完成。

为什么TCP连接不是两次握手?即为什么客户端最后会向服务器发送确认报文。

1:假设只有两次握手,客户端发出了一个连接请求报文A。但是由于网络原因,A并未及时到达服务器。之后客户端发送了连接请求报文B,并到达了服务器,随后双方建立连接,传输数据,最后断开连接。此时客户端进入CLOSED状态,服务器进入LISTEN状态。随后A报文到达服务器,由于服务器处于LISTEN状态,故服务器向客户端发送确认报文后进入ESTABLISHED状态并等待客户端发送数据。但是客户端此时处于CLOSED状态。收到服务器的确认报文后会丢弃该报文。服务器一直等待客户端传输数据,会造成副武器的资源浪费。

2:TCP的可靠传输要求通信双方判断自己发送的数据是否被接收到。TCP依靠的就是TCP报文中的序号和确认号。因此当TCP连接建立时双方均需要确认对方的初始序列号。而第三次握手则是客户端对服务器端的初始序列号的确认。因此第三次握手是必须的,否则无法保证服务器端到客户端的可靠传输。

为什么TCP连接不是4次握手?

三次握手已经能够证明客户端与服务器端之间的信道是可用的。再增加一次握手无非就是增加一点信道的可靠性,但是无论多少次握手都无法使信道100%可靠,因此也没有必要增加一次握手。

TCP断开连接的过程
在这里插入图片描述
1、客户端停止发送数据并发送连接释放请求报文,报文含有FIN=1,seq=u,并且进入FIN-WAIT-1状态。

2、服务器端接收到该报文后,返回一个连接释放确认报文。包含ACK=1,seq=v,ack=u+1,并进入CLOSE-WAIT状态,此状态下服务器端可能还会向客户端发送数据。

3、客户端收到确认报文后,进入FIN-WAIT-2状态,等待服务器发送连接释放请求报文,并接收服务器端可能发送的数据。

4、服务器端发送完所有数据之后,会发送连接请求释放报文。报文包含FIN=1,ACK=1,seq=w,ack=u+1,。之后服务器进入LAST-WAIT状态,等待客户端发来的连接释放确认报文。

5、客户端收到服务器的连接释放报文后,返回,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态,TCP连接此时未释放,因为不确定服务器端是否还有数据没有到达客户端。因此必须经过2MSL(最大报文生存时间)后,才进入CLOSED状态。
6、服务器只要收到了客户端发出的连接释放确认报文,立即进入CLOSED状态。
HTTP1.0和HTTP1.1和HTTP2.0的区别

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/406687.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android控件捕获点击事件的范围

View的Tween动画过程中点击事件的位置并不会因为动画位置的改变而改变,是因为在动画过程中layout的位置实际上没有变,因此曾经一度认为View的点击事件(其实不仅仅是点击事件,包括所有的触摸事件)触发的范围是该View在l…

利用闭包实现onclick事件传递参数

当触发点击事件&#xff0c;一个简单的例子。 <!DOCTYPE html> <html> <head><title>闭包创建数组</title><meta charset"utf-8"><script type"text/javascript">window.onload function (){var lis documen…

Python中文全攻略

From: http://www.sqlite.com.cn/MySqlite/11/395.Html 1. 在Python中使用中文 在Python中有两种默认的字符串&#xff1a;str和unicode。在Python中一定要注意区分“Unicode字符串”和“unicode对象”的区别。后面所有的“unicode字符串”指的都是python里的“unicode…

HTTP 304状态码的详细讲解

HTTP 304状态码的详细讲解 304状态码或许不应该认为是一种错误&#xff0c;而是对客户端有缓存情况下服务端的一种响应。 整个请求响应过程如下&#xff1a; 客户端在请求一个文件的时候&#xff0c;发现自己缓存的文件有 Last Modified &#xff0c;那么在请求中会包含 If …

[MySQL FAQ]系列 -- 数据不算大,备份却非常慢

作/译者&#xff1a;叶金荣&#xff08;Email: &#xff09;&#xff0c;来源&#xff1a;http://imysql.cn&#xff0c;转载请注明作/译者和出处&#xff0c;并且不能用于商业用途&#xff0c;违者必究。问题环境硬件&#xff1a;DELL 1950, 146G SAS 15K RPMS * 2, 8G Ram软件…

视频编解码:第一章 编解码基础

1. 视频编码概念 视频编码方式就是指通过特定的压缩技术&#xff0c;将某个视频格式的文件转换成另一种视频格式文件的方式。 2. 为什么要进行视频压缩&#xff1f; 数据太大&#xff1a;未经压缩的数字视频数据量巨大存储困难&#xff1a;一张DVD只能存储几秒钟的未压缩数字视…

Python 文件读和写

转载于:https://www.cnblogs.com/nzyjlr/p/4157582.html

element-ui 设置菜单栏展开

element-ui 侧边栏默认要全部展开怎么做&#xff1f; element-ui文档中是这么写的 default-openeds 当前打开的sub-menu的key数组 给标签加上这个属性 <el-menu class"el-menu-vertical" open"handleOpen" close"handleClose" theme"…

简单JS实现走马灯效果的文字(无需jQuery)

效果类似&#xff1a;(抱歉&#xff0c;图片是静态的) 写一段html&#xff0c;需要走马灯上下跳动的内容&#xff0c;但每次只显示一行&#xff1a;<hr size"0" align"center" style"border-top: 1px solid #F5F5F5;"/> <div id"m…

Android Service 生命周期

Android Service的生命周期 Managing the Lifecycle of a Service service的生命周期&#xff0c;从它被创建开始&#xff0c;到它被销毁为止&#xff0c;可以有两条不同的路径&#xff1a; A started service 被开启的service通过其他组件调用 startService()被创建。 这种ser…

新书出版:《Android深度探索(卷1):HAL与驱动开发》

《Android深度探索&#xff08;卷1&#xff09;&#xff1a;HAL与驱动开发》【1】亚马逊【2】当当网【3】京东商城【4】互动网【5】淘宝网【6】豆瓣网 《 Android深度探索&#xff08;卷1&#xff09;&#xff1a;HAL与驱动开发》分为4篇&#xff0c;分别从搭建开发环境&#x…

async-validator 表单验证两种数据的解决方案

上问题&#xff1a; 下面选项中后台给的value 有 number和 string 两种导致无法验证 解决方案 rules: [,{type: "string",required: true,message: 编码项目至少一项,trigger: change,transform(value) {var baseif(value){//在select中转换要加这个判断//因为sele…

米的建站日记(2014年12月15日)

今天试着定义了一个音乐实体如下图&#xff1a; 然后搜了下mongdb数据库层的框架&#xff0c;发现大部分都是用spring的&#xff0c;然后又去找相关的教程和demo&#xff0c;找到了 http://blog.csdn.net/cuiran/article/details/8287204 这篇博文&#xff0c;但是用在我自己的…