scrapy ip地址 tcp time out_TCP的运作流程(一)——“三次握手”

c8a55902d9030f03df41d762949922ab.png

前言

 看过前面有关两篇HTTP的文章的同学,想必对HTTP已经有了一定的了解。在HTTP初始(一)中提到过TCP/IP四层网络模型,这次我们就来详细了解一下TCP传输。因为时间和篇幅所限,本篇讲分为两章,本章讲TCP的三次握手,下章讲TCP的四次挥手,以及一些常见问题。723b270f79aca00430a40b4b7a5bd432.png

TCP的状态转化

先知全貌再看细节是很不错的学习方法,以后我的写作风格也尽量向这方面靠拢。所以在具体讲解TCP的三次握手和四次挥手前,我们先来整体看下TCP是如何运作的。      

                                  (该图片来源自网络)1253d12e70804a6ea54d8b3c4d7ac8e5.png我们先来具体了解下各个状态的具体含义和关系,前5步是TCP三次握手,后六步是TCP四次挥手:

  1. CLOSED:起始点,在超时或者连接关闭时进入此状态;Client和Server的初始态都应是CLOSED。

  2. LISTEN:Server端在等待连接时的状态,Server端为此要调用Socket、bind、listen函数,就能进入此状态。这称为应用程序被动打开(等待客户端来连接)。

  3. SYN-SENT:客户端发起连接,发送SYN给服务器端。如果服务器端不能连接则进入CLOSED状态。

  4. SYN-RCVD:与3对应,服务器端接受客户端的SYN请求,服务器端由LISTEN状态进入SYN-RCVD状态。同时服务器端要回应一个ACK,发送一个SYN给客户端;另一种情况是,客户端在发起SYN的同时接收到服务器端的SYN请求,客户端会由SYN-SEBT转换到SYN-RCVD状态。

  5. ESTABLISHED:服务器端和客户端在完成3次握手后进入状态,说明已经可以开始传输数据了。

  6. FIN-WAIT-1:主动关闭的一方,由状态5进入此状态。具体动作是发送FIN给对方。

  7. FIN-WAIT-2:主动关闭的一方,接收到对方的FIN ACK,进入此状态。由此不能再接收对方的数据,但是能够向对方发送数据。

  8. CLOSE-WAIT:接收到FIN以后,被动关闭的一方进入此状态。具体动作是再接收到FIN的同时发送ACK。

  9. LAST-ACK:被动关闭的一方,发起关闭请求,由状态8进入此状态。具体动作是发送FIN给对方,同时再接收到AKC时进入CLOSED状态。

  10. CLOSING:两边同时发起关闭请求时,会由FIN-WAIT-1进入此状态。具体动作是接收到FIN请求,同时响应一个ACK。

  11. TIME-WAIT:这个状态比较复杂,也是我们最常见的一个连接状态,有3个状态可以转化为此状态。

  • 由FIN-WAIT-2转换到TIME-WAIT,具体情况是:在双方不同时发起FIN的情况下,主动关闭的一方在完成自身发起的关闭请求后,接收到被动关闭一方的FIN后进入的状态。
  • 由CLOSING转换到TIME-WAIT,具体情况是:在双方同时发起关闭,都做了发起FIN的请求,同时接收到了FIN并做了ACK的情况下,这时就由CLOSING状态进入TIME-WAIT状态。
  • 由FIN-WAIT-1转换到TIME-WAIT,具体情况是:同时接收到FIN(对方发起)和ACK(本身发起的FIN回应),它与CLOSING转换到TIME-WAIT的区别在于本身发起的FIN回应的ACK先于对方的FIN请求到达,而由CLOSING转换到TIME-WAIT则是FIN先到达。

TCP报文

TCP报文是TCP传输的数据单元,也叫做报文段、数据包。

d0f4e4106ff8ea1c69b0194f9bd032f7.png
  1. 端口号:用来标识同一台计算机的不同的应用进程。
  2. 源端口(16位):与源主机IP地址一起标识源主机的一个应用进程。
  3. 目的端口(16位):和源主机IP地址一起标识目的主机的一个应用进程。IP报文中的源主机IP地址、目的主机的IP地址和源端口、目的端口确定了唯一一条TCP连接。
  4. 序列号seq(32位):标识从TCP源端向TCP目的端发送的数据字节流,表示这个报文段中的第1个字节的数据编号。在TCP传送的流中,每一个字节一个序号。比如:一个报文段的序号为300,此报文段数据部分共有100字节,则下一个报文段的序号为400。
  5. 确认号ack(32位):存储发送确认的一端所期望收到的下一个序列号seq。确认号ack是上次已成功收到的数据字节的序列号seq+1。只有ACK标志为1时确认号字段才有效。TCP为应用层提供全双工服务,这就意味着数据能在两个方向上单独进行传输。因此,连接的两端都必须保持每个方向上的传输数据的序列号。
  6. 同步序号SYN:在连接建立时同步序列号。SYN=1、ACK=0表示:这是一个连接请求报文段。若同意连接,则在响应报文段中,SYN=1,ACK=1。而且,SYN这个标志位只在”三次握手阶段“,也就是TCP建立连接阶段才会为1,完成后被置0.
  7. 确认号标志ACK:当ACK=1时,确认号字段才有效。
  8. 终止标志FIN:用于释放连接,FIN=1表示:数据发送方的数据已发送完毕,并关闭本方数据流。

TCP三次握手

其实三次握手就是用来建立TCP连接的,TCP数据在传输之前需要进行3次通信,一般被称为“三次握手”。这种建立连接的方式可以防止产生错误的连接,TCP使用的流量控制协议时可变大小的滑动窗口协议。

ce726d114bc8180203be1726fae97e41.png
  • 第一次握手:客户端发送SYN(seq=x)报文到服务器端,并进入SYN_SENT状态。
  • 第二次握手:服务器端收到来自客户端的SYN报文,向客户端回应一个SYN(seq=y)和ACK(ack=x+1)报文,并进入SYN_RCVD状态。
  • 第三次握手:客户端收到来自服务器端的SYN+ACK报文,向服务器端回应一个确认报文ACK(ack=y+1),发送完毕后,客户端和服务器端都进入ESTABLISHED状态。

在三次握手完成后,TCP客户端和服务器端成功建立连接,就可以传输数据了。

如此教科书般的回答,我也不是很满意,下面我们来从西瓜籽和大西瓜的对话中的了解下,什么是TCP三次握手:第一次:
西瓜籽:我是西瓜籽,大西瓜你真帅!
说明:西瓜籽会夸人。第二次:
大西瓜:我收到了你的夸赞,我是大西瓜,其实西瓜籽你也挺不错的!
说明:大西瓜可以接受别人的夸赞,也会夸人。第三次:
西瓜籽:我也收到了你的夸赞,我现在越看你越帅!
说明:西瓜籽也能接受别人的夸赞。

这俩人简直志同道合,然后就开始了双方的互夸Time.......(数据传输)

总结,我认为TCP三次握手有两个目的:一:是为了确保连接的两端都做好了发送和接收数据的准备工作二:每方都具有双方传输数据的序列号

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

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

相关文章

c++,c.c#区别

C则一般看作是对C语言的扩展。 Java语言是一种完全的面向对象语言,虽然它的底层(运行时库)是用C语言开发的,可是并不依赖于C。 C#是微软开发的一种编程语言,语法类似Java,几乎就是从Java的翻版。 &#xff…

php.ini 老薛,出现Allowed memory size of 134217728 bytes exhausted怎么办?

有站长在交流群内说到使用 ZBlogPHP 建站在发布文章的时候总是出现以下错误:Allowed memory size of 134217728 bytes exhausted(tried to allocate 12288 bytes)允许耗尽内存大小为 134217728 字节(试图分配 12288 字节)具体如下图所示:134217728 bytes…

winform窗体

WinForm是Net开发平台中对Windows Form的一种称谓。 中文名 Winform 特 点 功能强大 操作方便 新的数据提供程序管理 使用安全 利用公共语言运行库的安全特性 特点 Windows窗体的一些重要特点如下: 功能强大 Windows窗体可用于设计窗体和可视控件,以创建…

实例3:python

#一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? #假设该数为 x。 #1、则:x 100 n2, x 100 168 m2 #2、计算等式:m2 - n2 (m n)(m - n) 168 #3、设置&…

实例4:python

#输入某年某月某日,判断这一天是这一年的第几天? #!/usr/bin/python -- coding: UTF-8 -- #!/usr/bin/python -- coding: UTF-8 -- yearint(2019) monthint(8) dayint(13) months1[0,31,60,91,121,152,182,213,244,274,305,335,366] #闰年 months2[…

php html登陆逻辑,保持演示文稿(HTML)和逻辑(PHP)分开

我试图保持演示和逻辑分离,而不使用像Smarty这样的模板引擎.到目前为止我所做的工作是有效的,但我不知道如果不在我的演示文稿中添加更多PHP而不是我想做的事情.例如,现在我有这样的事情:product_list.phptry {$query $conn->prepare("SELECT p.id,p.name,…

层次分析法matlab_建模开讲课程回放2:层次分析法及其MATLAB

建模开讲:层次分析法及其MATLAB实践主讲人:于晶贤老师课程回放地址如下,大家可以复制链接到地址栏即可观看,也可以直接点击左下角的观看:https://ke.qq.com/webcourse/index.html?fromqqchat&cid493154&term_…

raw input()和input区别

版本差异 raw_input——》python2版本 input——》python3版本 2. 输入格式差异 就是raw_input()随便输都是字符串,而input()必须按照Python的规则来~ raw_input() nameraw_input(‘输入姓名:’) ageraw_input(‘输入年龄’) 我们输入汉字的姓名和数…

不同vlan之间如何ping通_【丰润达.安防百科】如何实现交换机不同VLAN、不同网段之间互访?...

交换机如何实现不同网段的互访?这个交换机完全可以实现,在实际项目中,交换机实现不同网段的互访用的也比较多,那么今天我们一起来看下。▎同一个vlan中,不同网段的主机如何互通同一个vlan,不同网段的主机如…

实例5:python

#输入三个整数x,y,z,请把这三个数由小到大输出。 l [] for i in range(3): x int(input(‘integer:\n’)) l.append(x) l.sort() print (l)

背景图层和普通图层的区别_008Photoshop四赞图层(图层样式)

图层过滤器图层滤镜,比如你只想看到像素图层,选择像素图层过滤器,这时就只能看到背景图层了(在图层面板),如果再点击像素图层过滤器,其他图层又出现了。选中调整图层过滤器,就只能看到图层结构里的调整图层…

实例6:python

#斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……。 #F0 0 (n0) #F1 1 (n1) #Fn F[n-1] Fn-2 #!/usr/bin/python -- coding: UTF-8 -- #def fib(…

vue devtools面板没有显示_vue 基础入门(四)

vue 基础入门(四)1.全局配置Vue.config 是一个对象,包含 Vue 的全局配置。可以在启动应用之前修改下列 property:1.1 silent类型:boolean默认值:false用法:Vue.config.silent true❝取消 Vue 所有的日志与警告。❞1.2…

vue 生命周期_Vue生命周期小白看了都会的

最近一直在学习Vue,而vue生命周期是我们不可能绕开的一个很核心的知识点,今天来简单的梳理一下大概的内容。一、钩子函数在一开始学习的时候,总有钩子函数这个名词冒出来,而且在vue官网文档中也频繁出现,也相信给很多初…

实例7:python

#将一个列表的数据复制到另一个列表中。 #程序分析:使用列表[:]。 #程序源代码: #!/usr/bin/python -- coding: UTF-8 -- #a [1, 2, 3] #b a[:] #print (b) #import copy #a [1, 2, 3] #bcopy.copy(a) #print(b) #[1, 2, 3] #使用 Python3 的参…

实例8:python

#输出 9*9 乘法口诀表。 #!/usr/bin/python -- coding: UTF-8 -- #for i in range(1, 10): print for j in range(1, i1): print ("%d*%d%d" % (i, j, i*j),) #!/usr/bin/python3 i0 j0 while i<9: i1 while j<9: j1 print(j,“x”,i,"",i*j,…

ant man 什么意思_浅谈为什么很多蓝牙模块厂家选择nRF52832?

浅谈为什么很多蓝牙模块厂家选择nRF52832&#xff1f;现在蓝牙低功耗(BLE)SOC作为新一代蓝牙&#xff0c;以其低功耗的优势&#xff0c;正凸显出强大的市场竞争力&#xff0c;而其中Nordic公司的nRF52832这一款低功耗蓝牙芯片更是受到大家的欢迎。Nordic是一家无晶圆厂半导体公…

实例9:python

#题目&#xff1a;暂停一秒输出。 #程序分析&#xff1a;使用 time 模块的 sleep() 函数 #!/usr/bin/python -- coding: UTF-8 -- import time l[1,2,3,4] for i in range(len(l)): print (l[i]) time.sleep(5) # 暂停一秒输出

php对话框制作,织梦系统“提示窗口对话框类”详解,oxwindow.class.php、catalog_do.php...

如果对织梦系统做过二次开发或学深入研究过的话&#xff0c;一定会知道在我们做织梦二次开发时&#xff0c;一般会把php文件以及对应的模板文件起的名字&#xff0c;除了扩展名外&#xff0c;其它都一样&#xff0c;这是织梦文件起名的一个特点。例如&#xff0c;index_body.ph…

B-JUI文档、下载

概述 特别说明 本文档仅适用于最新版的B-JUI&#xff0c;网站首页或下载页可以查看B-JUI的最后更新时间。 B-JUI前端管理框架适用于快速开发各类WEB管理系统&#xff0c;可与任意后端程序&#xff08;java、php、.net...&#xff09;配合使用。 B-JUI基于Bootstrap样式及jQuery…