当前位置: 首页 > 编程日记 > 正文

tcp 状态转换.

命令行:
root@ubuntu:/home/linson# netstat -apt | grep 3030

server,listen

服务端根据端口生成一个socket.用于监听连接.也就是监听3次握手,当3次握手成功,建立一个连接接放入队列中.

也就是说执行了listen,会自动应答3次握手,如果不执行listen,没有api会帮你处理3次握手.

所以客户端的connect应该也是自动执行3次握手.

tcp 0 0 localhost:3030 *:* LISTEN 11170/epoll

server 还没应答之前

可以看到连接已经建立,但是服务端的连接却没有pid和程序名字.

说明3次握手和连接的建立都和accept方法没有关系.

也说明一个端口可以建立很多连接.listen建立起来的,被api赋予专门的用途.就是接受和应答3次握手,并建立新连接.
tcp 0 0 localhost:3030 *:* LISTEN 11170/epoll
tcp 0 0 localhost:3030 localhost:33092 ESTABLISHED -
tcp 0 0 localhost:33092 localhost:3030 ESTABLISHED 11504/esocket6


应答之后

可以看到监听链接(由listen建立的)和客户端握手之后建立的新连接终于有pid了.也就是理论上.可以一个程序监听.一个程序accept.可是其他程序获取不到监听连接的描述符.所以...

所以accept,完全和tcp没有关系,只是和系统内核打交道.从队列中取链接而已.
tcp 0 0 localhost:3030 *:* LISTEN 11170/epoll
tcp 0 0 localhost:3030 localhost:33092 ESTABLISHED 11170/epoll
tcp 0 0 localhost:33092 localhost:3030 ESTABLISHED 11504/esocket6

客户端关闭.服务断还未应答.

可以看到客户端发送close,其实是发送一个字节.服务端的req是1,说明有一个字节从客户端发送来了,而没有读取.应该就是eof标记字节.

并且可以知道,服务端内核通过客户端的ip和port区分对于自己同一个端口的不同连接,并且应该是通过某个标记来注明特殊的listen链接.

如果握手,那么给listen文件描述符,如果接受信息.那么定位一下特定的文件描述符.

也就说明端口是系统的端口.来定位系统中的程序的。

socket是某个端口的socket.端口可以有很多socket,比如服务端。一个端口可以有很多socket,来区分客户端。而客户端也可以用一个端口来连不同的服务端。也可以用不同的端口连同一个服务端。

而文件描述符是一个读写属性的东西.可以由socket的listen得到.也就是一个由系统自动接受3次握手,也就是可以有读写属性的东西.用于和任何客户通讯.

并且文件描述符,也可以由文件描述符本身得到.也就是 liston文件描述符,的accept方法.由系统生成一个描述符,用于和特定客户通讯.

客户端关闭,那么客户端是期待服务端发送结束命令。进入等待fin阶段。也就是FIN_WAIT2

而服务端是等待服务程序响应关闭,如果不手动响应,那么就等待tcp协议自己经过20秒左右的自己应答。
tcp 0 0 localhost:3030 *:* LISTEN 11170/epoll
tcp 1 0 localhost:3030 localhost:33092 CLOSE_WAIT 11170/epoll
tcp 0 0 localhost:33092 localhost:3030 FIN_WAIT2 11504/esocket6

服务端应答,之后,服务端彻底释放了socket.客户端进入time_wait阶段。等待是否还有路上的数据没接受到。
tcp 0 0 localhost:3030 *:* LISTEN 11170/epoll
tcp 0 0 localhost:33092 localhost:3030 TIME_WAIT -

服务端应答 之后某几分钟之内. 客户端也彻底释放socket.
tcp 0 0 localhost:3030 *:* LISTEN 11170/epoll

知识点

1)程序奔溃会发送fin标记。

2)客户断的 TIME_WAIT是等待2msl.因为最后一个分组信息是客户端发送的.发送完毕之后.服务端并不会回应.所以

客户端辛苦一点,迟点下班,万一路由发生错误,还可以再发一次.

3)客户端连续发送2次close,是会导致发送rst?这个要再测试下.

tcp 0 0 192.168.87.130:3046 *:* LISTEN 22452/linsonnetlib
root@ubuntu:/home/linson# netstat -apt |grep 3046
tcp 0 0 192.168.87.130:3046 *:* LISTEN 22452/linsonnetlib
tcp 0 0 192.168.87.130:3046 192.168.87.130:40604 ESTABLISHED -
tcp 0 0 192.168.87.130:40604 192.168.87.130:3046 ESTABLISHED 22452/linsonnetlib
root@ubuntu:/home/linson# netstat -apt |grep 3046
tcp 0 0 192.168.87.130:3046 *:* LISTEN 22452/linsonnetlib
tcp 0 0 192.168.87.130:3046 192.168.87.130:40604 ESTABLISHED -
tcp 0 0 192.168.87.130:40604 192.168.87.130:3046 ESTABLISHED 22452/linsonnetlib
root@ubuntu:/home/linson# netstat -apt |grep 3046
tcp 0 0 192.168.87.130:3046 *:* LISTEN 22452/linsonnetlib
tcp 2 0 192.168.87.130:3046 192.168.87.130:40604 ESTABLISHED -
tcp 0 0 192.168.87.130:40604 192.168.87.130:3046 ESTABLISHED 22452/linsonnetlib
root@ubuntu:/home/linson# netstat -apt |grep 3046
tcp 0 0 192.168.87.130:3046 *:* LISTEN 22452/linsonnetlib
tcp 3 0 192.168.87.130:3046 192.168.87.130:40604 CLOSE_WAIT -
tcp 0 0 192.168.87.130:40604 192.168.87.130:3046 FIN_WAIT2 -
root@ubuntu:/home/linson# netstat -apt |grep 3046
tcp 0 0 192.168.87.130:3046 *:* LISTEN 22452/linsonnetlib
tcp 3 0 192.168.87.130:3046 192.168.87.130:40604 CLOSE_WAIT 22452/linsonnetlib
root@ubuntu:/home/linson# netstat -apt |grep 3046
tcp 0 0 192.168.87.130:3046 *:* LISTEN 22452/linsonnetlib
tcp 3 0 192.168.87.130:3046 192.168.87.130:40604 CLOSE_WAIT 22452/linsonnetlib
root@ubuntu:/home/linson# netstat -apt |grep 3046
tcp 0 0 192.168.87.130:3046 *:* LISTEN 22452/linsonnetlib
tcp 0 0 192.168.87.130:3046 192.168.87.130:40604 CLOSE_WAIT 22452/linsonnetlib
root@ubuntu:/home/linson# netstat -apt |grep 3046
tcp 0 0 192.168.87.130:3046 *:* LISTEN 22452/linsonnetlib
root@ubuntu:/home/linson#

在linux 下有个ipython,

确实是个神器。

开2个终端。输入以下相关代码,

就可以立马实时查看网络通讯状态。

再开一个终端。输入netstat相关命令查看双方状态。

方便的一塌糊涂。

ipython
import socket,select
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('',6000))
s.listen(10)
c1,a1=s.accept()
c1.setblocking(0)


import socket,select
c=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
c.connect(('',6000))
c.shutdown(socket.SHUT_WR)

关闭的四次握手。

可以是客户端,2次关闭(一次shutdown,一次close),或2次close

这样服务端可以处于被动关闭状态。因为多线程环境下。短链接,服务端比较难判断是否消息全部发送完毕。

而客户端可以异步接受后,再一次主动关闭连接。会发送reset信号,服务端如果是epoll管理,取消关注事件后。好像会立即断开。而如果是一般监听。会进入closewait.

client              server

shutdown

fin->

fin1

        -<act

        colsewait

fin2

close->

fin2->

                       -<act

over                 close wait

1)发起关闭的一方,会进入fin_wait1 阶段。

对端由tcp 协议回应,

对端进入 close_wait 阶段。

发起一方进入fin_wait2阶段。

2)对端接受0.关闭 进入lastack,

而起初发送的一方由tcp协议回应,进入time _wait

对端直接close.

所以经常见到的是close_wait,fin_wait2,time _wait这3个状态。

其他状态,由于tcp协议自动的回应,是立马消失的

3)发送数据如果对方缓冲满。发送会失败。而不是说我们的发送缓冲区没满就会接受。

经过测试,对方满。滑动窗口为0的时候。我们的发送就失败。这个时候,我们的发送缓冲区还是有些数据的,是由于网络通知的时间差,导致发现不能发送的时候,程序已经send不少了。但之后的send函数会失败。

这个时候不但我们应用层挤压了数据。连发送缓冲区也挤压了。所以tcp的绝对可靠不是对用户来说。而是对于机制来说。

这个时候如果取消接受事件,但是之前还是有挤压的接收事件存在。

转载于:https://www.cnblogs.com/lsfv/p/6367395.html

相关文章:

增加、修改、删除

第一;,models.py建表 from django.db import models# Create your models here.class Book(models.Model): #必须继承models.Model这个类&#xff0c;jango才能识别Book是一张表namemodels.CharField(max_length20)#charfield字符串类型&#xff0c;长度20#pricemodels.FloatFi…

java ee 笔试题目,JSP经典笔试@题目(含答案)

JSP经典笔试题目(含答案)更新时间&#xff1a;2017/2/5 19:25:00 浏览量&#xff1a;557 手机版JSP综合测试笔试1)在Java EE中&#xff0c;Servlet是在服务器端运行&#xff0c;以处理客户端请求而做出的响应的程序&#xff0c;下列选项中属于Servlet生命周期阶段的是( )A.加…

句法依存分析_[NLP学习笔记]句法分析

句法分析任务简介成分句法分析&#xff08;Constituency Parsing&#xff09;&#xff1a;分析句子的成分&#xff0c;给出一棵树由终结符和非终结符构成的句法树。依存句法分析&#xff08;Dependency Parsing&#xff09;&#xff1a;分析句子中词与词之间的依存关系&#xf…

modifiers在JAVA中_Java Modifier.classModifiers方法代碼示例

import java.lang.reflect.Modifier; //導入方法依賴的package包/類/*** Returns a string describing this {code Class}, including* information about modifiers and type parameters.** The string is formatted as a list of type modifiers, if any,* followed by the k…

华为笔试题---明明的随机数

题目 明明想在学校中请一些同学一起做一项问卷调查&#xff0c;为了实验的客观性&#xff0c;他先用计算机生成了N个1到1000之间的随机整数&#xff08;N≤1000&#xff09;&#xff0c;对于其中重复的数字&#xff0c;只保留一个&#xff0c;把其余相同的数去掉&#xff0c;不…

扩展城市信道etu模型matlab仿真,LTE System Toolbox:无线通信系统的仿真、分析和测试...

LTE System Toolbox 提供用于设计、仿真和验证 LTE 和 LTE-Advanced 通信系统且符合标准的函数和应用程序。该系统工具箱加速了 LTE 算法和物理层 (PHY) 部署&#xff0c;支持黄金参考验证和一致性测试&#xff0c;并能够生成测试波形。借助该系统工具箱&#xff0c;您可以配置…

i/o多路复用笔记

1、用户空间和内核空间 操作系统的核心是内核&#xff0c;独立于普通的应用程序&#xff0c;可以访问受保护的内存空间&#xff0c;也可以访问底层硬件设备。为了保护用户进程不能直接操作内核&#xff0c;保证内核的安全&#xff0c;操作系统将虚拟空间划分为两部分&#xff0…

接口有个电池标志_USB接口上的小标签有啥用?从“+”号到闪电的奥秘

你有注意过自己PC&#xff0c;尤其是笔记本USB接口上面的小符号了吗&#xff1f;从“”号到闪电&#xff0c;小狮子前几天移动硬盘接驳始终没反应的时候&#xff0c;各种切换完毕发现这似乎是一个平时很少注意的细节啊……从“”号开始谈起仔细端详PC USB接口的时候会发现&…

java arraylist优点_Java中各种集合的特点总结

1:集合&#xff1a;(1) Collection(单列集合)List(有序,可重复)ArrayList底层数据结构是数组,查询快,增删慢线程不安全,效率高Vector底层数据结构是数组,查询快,增删慢线程安全,效率低LinkedList底层数据结构是链表,查询慢,增删快线程不安全,效率高Set(无序,唯一)HashSet底层数…

mysql主从结构主数据库_mysql主从结构主数据库

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航&#xff0c;为用户…

JZOJ 5461 购物 —— 贪心

题目&#xff1a;https://jzoj.net/senior/#main/show/5461 贪心&#xff0c;原来想了个思路&#xff0c;优先选优惠价最小的 K 个&#xff0c;然后其他按原价排序遍历&#xff1b; 如果当前物品没选过&#xff0c;原价选上&#xff0c;如果选过&#xff0c;考虑把它换成原价&a…

matlab中的expotest,提高Fortran矩阵指数性能(Expokit比Matlab、Python慢)

我正在进行一个模拟&#xff0c;其中的瓶颈是执行大量复杂的双精度矩阵指数运算&#xff0c;我发现Fortran(Expokit)对于小矩阵很好&#xff0c;但对于较大的矩阵&#xff0c;它的性能比Matlab或Python差。在我在下面包含了一个显示类似行为的模型程序&#xff0c;尽管它需要更…

Win7下使用Putty代替超级终端通过COM串口连接开发板方法

1、如果电脑&#xff08;笔记本&#xff09;没有串口接口&#xff0c;则需要使用一个 USB-Serial 转换线&#xff0c;这里使用 prolific usb-serial USB--串口转换线&#xff0c;首先需要在win7上安装对应的 USB--串口转换线 驱动程序&#xff0c;PL2303_Prolific 驱动程序下载…

java内部类 缺点_Java中的内部类及其优势

Java中提供了定义内部类的选择&#xff0c;这一机制使得代码的书写更为方便和优雅(功能上相关的代码被紧密的组织在了一起)。需要注意的是&#xff0c;内部类和传统的组合(即将一个类的实体定义为另一个类的成员)是完全不同的&#xff0c;其主要特性表现在以下的一些方面&#…

php webapi验签,Asp.netCore3.0 WebApi从0到1手摸手教你写【5】增加接口参数签名验证...

通过前几个教程的学习&#xff0c;对webapi的编写基本上就可以入门了&#xff0c;可以做项目了&#xff0c;今天我们再给接口加个参数签名认证&#xff0c;之前的接口相当于赤果果的暴露在了网络上&#xff0c;只要知道接口地址、接口调用方式和传参就可以畅所欲为的调用接口了…

点击TableView任一行跳转详情页面会跳转两次的解决办法

在做TableView跳转的时候&#xff0c;发现实际上生成了两个detail view。我 navigate back 的时候&#xff0c;也是先看到一次detail view&#xff0c;然后才回到tableView的。 这是因为&#xff1a;performSegue(withIdentifier: , sender: ) 和 prepare(for segue: , sender:…

dos环境下mysql的访问_MYSQL dos环境下使用

有很多朋友虽然安装好了mysql但却不知如何使用它。在这篇文章中我们就从连接MYSQL、修改密码、增加用户等方面来学习一些MYSQL的常用命令。一、连接MYSQL。格式&#xff1a; mysql -h主机地址 -u用户名 &#xff0d;p用户密码1、例1&#xff1a;连接到本机上的MYSQL。首先在打开…

jemeter监听器的使用

打开jemeter&#xff0c;新建线程组&#xff0c;添加http请求&#xff0c;在请求下添加监听器&#xff1a; 一、添加一个jpgc - PerfMon Metrics Collector监听器&#xff1a; 服务器性能监测控件&#xff0c;包括CPU,memory&#xff08;内存&#xff09;,network&#xff29;/…

java 抛异常给上级_java异常处理机制(示例代码)

Exception 类的层次java中所有的异常类是从 java.lang.Exception 类继承的子类。而Exception 类是 Throwable (可抛出的)类的子类。除了Exception类外&#xff0c;Throwable还有一个子类Error 。Java 程序通常不捕获错误。错误一般发生在严重故障时&#xff0c;它们在Java程序处…

前端开发之JavaScript基础篇一

主要内容&#xff1a; 1、JavaScript介绍 2、JavaScript的引入方法和输出及注释 3、javaScript变量和命名规则 4、五种基本数据类型 5、运算符 6、字符串处理 7、数据类型转换 一、JavaScript介绍 1、JavaScript是什么&#xff1f;     javaScript是一种web前端的描述语言&…

v9php 碎片信息,phpcms v9碎片管理及调用技巧分享

今天在这里将分享下Phpcms V9碎片管理及调用技巧。这是关于模板数据自定义、方便客户在后台管理数据调用的一个技巧。在给客户定制模板的时候&#xff0c;往往会涉及到的一个问题就是&#xff1a;有些数据(图片文字&#xff0c;比如LOGO、侧栏的联系方式、首页的幻灯片切换Bann…

iterm2 主题_【超级实用】Iterm2 + ohmyzsh 打造强大的终端编辑器

作者&#xff1a;AndrewHR 地址&#xff1a;http://mrw.so/4D1n7B最终的效果图如下所示&#xff1a;使用iterm2配合oh-my-zsh的命令行&#xff0c;拥有语法高亮、命令自动补全、自动提示符、显示git仓库状态等功能整个配置流程1、安装iterm2首先我们下载的 iterm2 这个软件&…

main方法为什么是静态的

main函数其实也是所在类的一个方法&#xff0c;就比如一个类是test&#xff0c;那么该类的main其实就是test.main(String[] args)&#xff0c;众所周知如果一个方法不是静态的&#xff0c;则要先实例化该类&#xff0c;比如要这样 test tnew test(); 然后才能调用 test.main();…

java类为什么要建两个class_ClassLoader的几个概念、类和对象的解释

首先&#xff0c;转载一篇文章&#xff0c;个人认为是看到过了讲得最清楚的 XD当JVM(Java虚拟机)启动时&#xff0c;会形成由三个类加载器组成的初始类加载器层次结构&#xff1a;bootstrap classloader|extension classloader|system classloaderbootstrap classloader &#…

第四章 python的turtle库的运用

我们可以尝试用python的自带turtle库绘制一条蟒蛇 首先我们设计一下蟒蛇的基本形状 我们先把这段蟒蛇绘制的实例代码贴出来&#xff0c;各位可以在自己的本地运行一下看看效果&#xff0c;然后我们再继续分析代码&#xff1a; 1 #PythonDraw.py2 import turtle3 turtle.setup(6…

oracle导入索引b报错,impdp导入索引很慢

impdp用NETWORK_LINK从远程库导入到本地库&#xff0c;导入表的速度还正常&#xff0c;导入索引的速度特别慢。2个小时才导1300个索引。使用imp的格式&#xff1a;impdp vebackup/abc DIRECTORYDATABAK_DIR NETWORK_LINKprimarydb_link SCHEMASveasms TABLE_EXISTS_ACTIONREPLA…

新的mysql如何使用_如何使用新的MySQL更新日志

使用新的MySQL更新日志的方法未必人人都会&#xff0c;下面就教您如何使用新的MySQL更新日志的方法&#xff0c;希望对您能够有所帮助。如果你只使用一使用新的MySQL更新日志的方法未必人人都会&#xff0c;下面就教您如何使用新的MySQL更新日志的方法&#xff0c;希望对您能够…

find_in_set

在查询表中数据用 ‘,’隔开的记录时 如图所示 用like 查询auth 字段中含A5是查不出来的 如图所示 用find_in_set 可以查询出 auth字段含 ‘A5’的记录 如图所示 用法介绍&#xff1a; find_in_set 可以查询出字段内容以英文逗号隔开的记录 find_in_set(匹配值,字段名)转载于:h…

一堆棋子java代码编程_网易2018校招内推编程题-堆棋子-C++实现

0 1 3 10解法暴力枚举所有可能的点。如图所示&#xff0c;黑点为输入点。所需遍历的点为红线的交点&#xff0c;红圈表示。当时自己写的是遍历了外围红线所构成的封闭矩形里面所有的点了&#xff0c;只有60%的AC率&#xff0c;原因超时。看了康学长的代码&#xff0c;才知道有些…

linux free命令详解和使用实例(查看内存使用率)

free命令可以显示Linux系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer。在Linux系统监控的工具中&#xff0c;free命令是最经常使用的命令之一1&#xff0e;命令格式&#xff1a; free [参数] 2&#xff0e;命令功能&#xff1a; free 命令显示系统使用和空闲的…