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

相关文章

超级强大的socket工具ss,替代netstat

1、结论:ss 命令比netstat 更强大,提供功能更多,并且性能更高。 2、显示当前系统的socket占用总体宏观情况。 ss -s 当已创建的socket数过多时,已经说明系统配置存在问题。 3、显示tcp的socket情况 ss -a -t 显示udp的socket情况…

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…

python歌曲_python抓取并下载音乐歌曲

import requestsimport jsonimport osclass My_Music():def __init__(self):print("*"*25"音乐抓取器""*"*25)key_name input(*请输入你要查找的歌曲名称*:)num input(*请输入你要查看歌曲列表第几页*:)self.headers {…

UVA 1645 - Count(简单DP)

题目链接 https://cn.vjudge.net/problem/UVA-1645 【题意】 输入n&#xff08;n<1000&#xff09;统计有多少个n个结点的有根树&#xff0c;使得每个深度中所有结点的子结点数相同 【思路】 设答案为dp[n]&#xff0c;肯定要拿一个结点作为根&#xff08;第0层&#xff0…

winform窗体

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

win8配置mysql5.6,win8.1(64位) apache2.4.3+php5.6.3+mysql5.6安装

Mysql5&period;5升级到5&period;7后MySQLdb不能正常使用的问题解决ubuntu系统 报错信息1 Type "help", "copyright", "credits" or "license&qu ...Python学习笔记之Beautiful Soup如何在Python3.x中使用Beautiful Soup 1.Beau…

python词频统计结果写入csv_Python词频对比并导入CSV文件

需要用到的停用词库我上传到我的资源了&#xff0c;大家也可以自己去网上找&#xff01;本来是想把两个词频统计放入一个CSV文件中&#xff0c;但是无奈向已经存在的CSV文件中追加写入数据只能在已经存在的数据下面追加&#xff0c;也就是在同一列追加&#xff0c;不能另起一列…

计算公式

公式&#xff1a; 1 网段数2^可变的网络ID位数 2 一个网段中主机数2^主机ID位数&#xff08;32-网络ID位数&#xff09;-2 3 CIDR无类域名路由:网络ID位数不确定&#xff0c;CIDR表示法&#xff1a;IP/网络ID位数 10.0.0.100/8 255.0.0.0 4 网络IDIP与netmask 5 判断目标主机是…

实例3:python

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

php word excel,PHP 生成word 和 excel 文档

xmlns"http://www.w3.org/TR/REC-html40">word 中要显示的内容&#xff0c; 由于word支持html格式, 所以中间这一部分使用html文档就可以.?如果做文件下载:?header("Content-type:application/vnd.ms-word");header("Content-Disposition:filena…

实例4:python

#输入某年某月某日&#xff0c;判断这一天是这一年的第几天&#xff1f; #!/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[…

堆排序python代码实现_python实现堆排序

首先理解堆排序&#xff1a;堆&#xff1a;堆栈是计算机的两种最基本的数据结构。堆的特点就是FIFO(first in first out)先进先出&#xff0c;这里的话我觉得可以理解成树的结构。堆在接收数据的时候先接收的数据会被先弹出。栈的特性正好与堆相反&#xff0c;是属于FILO(first…

jq多选框全选,多选

html代码 <input type"hidden" name"f_information_id" id"f_information_id" value"<?php echo $f_information_id?>"> <table class"table table-hover"><thead><tr><th> <inpu…

无人驾驶技术(1)

无人驾驶汽车有望将在未来20年内得到广泛运用&#xff0c;各大科技公司和汽车厂商均在加大对无人驾驶的投入&#xff0c;资本也纷纷抢滩该万亿市场。 无人驾驶汽车依靠人工智能、视觉计算、雷达、监控装置和全球定位系统协同合作&#xff0c;通过电脑实现无人驾驶&#xff0c;可…

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

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

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

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

raw input()和input区别

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

防抖debounce和节流throttle

大纲 一、出现缘由 二、什么是防抖debounce和节流throttle 三、应用场景 3.1防抖 3.2节流 一、出现缘由 前端开发中&#xff0c;有一部分用户行为会频繁触发事件&#xff0c;而对于DOM操作&#xff0c;资源加载等耗费性能的处理&#xff0c;很可能导致卡顿&#xff0c;甚至浏览…

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

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