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,一经查实,立即删除!

相关文章

Session莫名丢失的原因及解决办法[转载]

Asp.net 默认配置下,Session莫名丢失的原因及解决办法 正常操作情况下Session会无故丢失。因为程序是在不停的被操作,排除Session超时的可能。另外,Session超时时间被设定成60分钟,不会这么快就超时的。 这次到CSDN上搜了一下帖子…

Python的构造函数和析构函数,对象和类的不一样

1.Python像其他的OOP语言一样在类里面会有构造和析构函数... 类似于PHP的, 构造和析构函数并不需要显式的写出来...他们只是在这个对象生成和销毁的时候才会被调用.. 如果显式的定义了,那么在对象被生成和销毁时就会分别的调用这两个函数 构造函数: __init__ 这个函数在用代码生…

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…

ms sql 触发器( 转)

create trigger TgNameon tbfor updateas if update(recommend)begin update tb set commenddate(getdate()) from tb inner join inserted on tb.vlistidInserted.vlistidend关键在于Inserted表触发器语句中使用了两种特殊的表&#xff1a;deleted 表和 inserted 表。Dele…

Sicily 1034. Forest

题目地址&#xff1a;1034. Forest 思路&#xff1a; 网上很多说用深搜&#xff0c;很任性.......发现广搜也挺好用的&#xff0c;实验课打的(⊙o⊙)…orz........囧。 先找根结点&#xff0c;根据根结点广搜深度&#xff0c;广搜宽度&#xff0c;不过要开一个数组&#xff0c;…

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]删除列表中相同的元素

去除列表中重复的元素&#xff0c;非常简单&#xff0c;直接上代码&#xff1a; a [11, 21, 3, 4, 3, 2, 5] b list(set(a)) print(a) print(b)运行结果&#xff1a; E:\Program\Python>d.py [11, 21, 3, 4, 3, 2, 5] [2, 3, 4, 5, 11, 21]看到了吗&#xff0c;结果中确实…

js-cookie使用方法

该插件解决了原生js操作cookie的麻烦 js-cookie使用方法 js-cookie用来处理cookie相关的插件&#xff0c;非常简单好用&#xff0c;下面简单记录一下&#xff1a;1、项目中引用&#xff1a; npm install --save js-cookie2、js-cookie的使用&#xff1a; 安装好js-cookie插…

WindowsXP命令行修改服务启动选项

1、修改服务启动类型&#xff1b;使用命令sc&#xff0c;命令使用方法见下例&#xff1a;sc config messenger displayname "messenger" start auto说明&#xff1a;messenger:所要操作的服务名称displayname "messenger":所要操作的服务名称显示出来的名称…

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"…

删除列表中满足一定条件的元素

从列表中删除满足一定条件的元素。 如&#xff1a;删除一个列表中长度为0的元素&#xff0c;或者删除列表中同时是2和3的倍数的元素。 做过高级语言编程的人想当然的会认为“这很简单”&#xff0c;可以如下面的方式来实现&#xff1a; for i in listObj:if(...):listObj.rem…

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

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