Linger

使用JMeter测试TCP协议

瘦欲@ 提交于 2020-08-05 06:33:24
本文主要介绍如何使用JMeter对TCP协议进行测试 1、TCP概念 2、TCP协议的三次握手 3、TCP取样器参数介绍 4、Wireshark抓包和开发TCP脚本 一、TCP概念 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内另一个重要的传输协议。数据传输时,应用程序向TCP层发送数据流,TCP就会将接受到的数据流切分成报文段(会根据当前网络环境来调整报文段的大小),然后经过下面的层层传递,最终传递给目标节点的TCP层。为了防止丢包,TCP协议会在数据包上标有序号,对方收到则发送ACK确认,未收到则重传。这个步骤就是我们通常所说的TCP建立连接的三次握手。同时TCP会通过奇偶校验和的方式来校验数据传输过程中是否出现错误。 二、TCP协议的三次握手 第一次握手:客户端发送syn包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认; 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack

Linux-socket的close和shutdown区别及应用场景

白昼怎懂夜的黑 提交于 2020-07-29 06:26:21
shutdown的定义 #include<sys/socket.h> int shutdown( int sockfd, int how);   how的方式有三种分别是:     SHUT_RD(0):关闭sockfd上的读功能,此选项将不允许sockfd进行读操作。即 该套接字不再接受数据,任何当前在套接字接受缓冲区的数据将被丢弃 。进程将不能对该套接字发出任何读操作。对TCP套接字该调用之后接受到的任何数据将被确认然后无声的丢弃掉。     SHUT_WR(1):关闭sockfd的写功能,此选项将不允许sockfd进行写操作,即进程不能在对此套接字发出写操作。     SHUT_RDWR(2):关闭sockfd的读写功能,相当于调用shutdown两次:首先是以SHUT_RD,然后以SHUT_WR。   成功则返回0,错误返回-1,错误码errno:EBADF表示sockfd不是一个有效描述符;ENOTCONN表示sockfd未连接;ENOTSOCK表示sockfd是一个文件描述符而不是socket描述符。   shutdown()的效果是累计的,不可逆转的。既如果关闭了一个方向数据传输,那么这个方向将会被关闭直至完全被关闭或删除,而不能重新被打开。如果第一次调用了shutdown(0),第二次调用了shutdown(1),那么这时的效果就相当于shutdown(2)

IO积累01

家住魔仙堡 提交于 2020-07-29 00:46:47
mysql更新数据需要redo log,然后把数据保存到内存,有系统调用flus保存到磁盘中,是因为系统IO的原因,系统会把数据放到pagecacache中,如果对数据修改会标记为脏,这个标记是对所有的pagecache的,不是单指一个,然后有系统统一的flus到磁盘中;这就是为什么数据库修改数据保存到redo log中有延迟不是直接写入到磁盘中的原因。 说的不准确,知道大概过程 Linux有一个虚拟文件目录,都会挂载到相应的地方,比如dev3这块磁盘挂载到book虚拟目录上,进入book目录,其实就是进入到dev3中,所以就可以扩容,比如要存10T文件存入某个目录,可以把一个磁盘挂载到这个目录上,就可以保存了。 Linux虚拟文件系统,可以创建一个xxx.img文件,然后挂载到虚拟目录上,然后把可执行程序保存到虚拟目录中,实际操作的就是被挂载的xxx.img这块控件,可执行程序的根目录就是xxx.img,然后卸载xxx.img,把xxx.img挂载到其他虚拟目录也一样可以执行里面的程序,相当于一个容器,docket使用类似的原理; 磁盘IO pagecache作用 :内存中运行着各种应用,包括操作系统(kernel),但是应用不是一次性加载到内存中的,内存是分页存储的,每页大小4K,应用从磁盘加载到内存都是一页一页加载的,每个应用都有一个页表,里面记录页的线性地址

Java套接字Socket编程--TCP参数

霸气de小男生 提交于 2020-07-28 10:46:17
在Java的Socket中,主要包含了以下可设置的TCP参数。 属性 说明 默认值 SO_TIMEOUT 对ServerSocket来说表示等待连接的最长空等待时间; 对Socket来说表示读数据最长空等待时间。 0 TCP_NODELAY 是否一有数据就马上发送。 false SO_LINGER 优雅地关闭套接字,或者立刻关闭。 -1 SO_SNDBUF 发送数据的缓冲区大小。 8K SO_RCVBUF 接收数据的缓冲区大小。 8K SO_KEEPALIVE 是否启用心跳机制。 false SO_REUSEADDR 是否地址重用。 false BACKLOG 服务端处理线程全忙后,允许多少个新请求进入等待。 50 1.1 BACKLOG BACKLOG用于构造服务端套接字ServerSocket对象,标识当服务器请求处理线程全满时,用于临时存放已完成三次握手的请求的队列的最大长度。如果未设置或所设置的值小于1,Java将使用默认值50。 ServerSocket serverSocket = new ServerSocket(8080, 100); 1.2 TCP_NODELAY 在TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认。为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据

kafka TimeoutException 超时问题解决

∥☆過路亽.° 提交于 2020-04-29 17:16:54
1、报错:: java.util.concurrent.ExecutionException: org.apache.kafka.common.errors.NotLeaderForPartitionException: This server is not the leader for that topic-partition.  报错原因:producer在向kafka broker写的时候,刚好发生选举,本来是向broker0上写的,选举之后broker1成为leader,所以无法写成功,就抛异常了。  解决办法:修改producer的重试参数retries参数,默认是0, 一般设置为3, 我在生产环境配置的retries=10 2、java.util.concurrent.ExecutionException: org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for binlogCsbbroker-2 due to 30026 ms has passed since batch creation plus linger time   报错原因:具体原因我自己还没有找到,但是网友们都说是因为kafka在批量写的时候,这一批次的数据没有在30s内还处理完,(30s为request

4.kafka生产者---向Kafka中写入数据(转)

三世轮回 提交于 2020-04-26 07:39:48
转: https://www.cnblogs.com/sodawoods-blogs/p/8969513.html (1)生产者概览 (1)不同的应用场景对消息有不同的需求,即是否允许消息 丢失 、 重复 、 延迟 以及 吞吐量 的要求 。 不同场景对Kafka生产者的API使用和配置会有直接的影响。 例子1:信用卡事务处理系统,不允许消息的重复和丢失,延迟最大500ms,对吞吐量要求较高。 例子2:保存网站的点击信息,允许少量的消息丢失和重复,延迟可以稍高(用户点击链接可以马上加载出页面即可),吞吐量取决于用户使用网站的频度。 (2)Kafka发送消息的主要步骤 消息格式:每个消息是一个ProducerRecord对象, 必须指定 消息所属的Topic和消息值Value,此外 还可以指定 消息所属的Partition以及消息的Key。 1:序列化ProducerRecord 2:如果ProducerRecord中指定了Partition,则Partitioner不做任何事情;否则,Partitioner根据消息的key得到一个Partition。这是生产者就知道向哪个Topic下的哪个Partition发送这条消息。 3:消息被添加到相应的batch中,独立的线程将这些batch发送到Broker上 4:broker收到消息会返回一个响应。如果消息成功写入Kafka

深入探索 TCP TIME-WAIT

旧城冷巷雨未停 提交于 2020-04-18 06:48:26
1​ TIME-WAIT 状态 主动关闭连接的一方,在四次挥手最后一次发送 ACK 后,进入 TIME_WAIT 状态。在这个状态里,主动关闭连接一方等待 2MSL(Maximum Segment Life,报文段最大生存时间,在RFC793 中定义为 2 min,而在 Linux 中定义为 30s),若这段时间内未收到被动关闭一方重发的 FIN,则由 TIME_WAIT 状态转到 CLOSED 状态。 祭上状态机图: 在这里为了讨论方便,假设主动关闭连接的一方均为本地客户端,被动关闭连接的一方均为服务端,以客户端与服务端 TCP 状态的变化来讨论。 2​ 存在的目的 为什么 TCP 需要设置 TIME-WAIT 状态等待 2MSL 才能转到 CLOSED 状态关闭连接呢? ​2.1​ 避免在新连接上收到旧连接的数据 避免在同一四元组(源地址、源端口、目的地址、目的端口)上的新连接收到旧连接的数据。 如下图所示,服务端第一次发送的序号为 3 的数据包因延时未送达客户端,服务端重发第二次序号为 3 的数据包后客户端接收到并主动断开连接。 在很短时间内,客户端重新向服务端发起连接,这时服务端发送序号 1、序号 2 的数据给客户端,但同时客户端也收到了在网络上延时到达的服务端第一次发送的序号为 3 的数据包。 RFC793 中描述了 ISN 每 4 微秒会自增 1,达到 2^32 后又从

硬不硬你说了算!近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题

一个人想着一个人 提交于 2020-04-10 07:44:51
前言 不管面试 Java 、C/C++、Python 等开发岗位, TCP 的知识点可以说是的必问的了。 任 TCP 虐我千百遍,我仍待 TCP 如初恋。 不会没关系,今天就让我们来消除这份恐惧,微笑着勇敢的面对它吧! 于是我整理了关于 TCP 三次握手和四次挥手的面试题型 ,跟大家一起探讨探讨。 TCP 基本认识 T CP 连接建立 TCP 连接断开 Socket 编程 PS:本次文章不涉及 TCP 流量控制、拥塞控制、可靠性传输等方面知识,这些留在下篇哈! 正文 01 TCP 基本认识 瞧瞧 TCP 头格式 我们先来看看 TCP 头的格式,标注颜色的表示与本文关联比较大的字段,其他字段不做详细阐述。 TCP 头格式 序列号 :在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。 用来解决网络包乱序问题。 确认应答号 :指下一次「期望」收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。 用来解决不丢包的问题。 控制位: ACK:该位为 1 时,「确认应答」的字段变为有效,TCP 规定除了最初建立连接时的 SYN 包之外该位必须设置为 1 。 RST:该位为 1 时,表示 TCP 连接中出现异常必须强制断开连接。 SYC:该位为 1 时,表示希望建立连,并在其

硬不硬你说了算!35 张图解被问千百遍的 TCP 三次握手和四次挥手面试题

非 Y 不嫁゛ 提交于 2020-04-06 16:51:43
每日一句英语学习,每天进步一点点: 前言 不管面试 Java 、C/C++、Python 等开发岗位, TCP 的知识点可以说是的必问的了。 任 TCP 虐我千百遍,我仍待 TCP 如初恋。 遥想小林当年校招时常因 TCP 面试题被刷,真是又爱又狠…. 过去不会没关系,今天就让我们来消除这份恐惧,微笑着勇敢的面对它吧! 所以小林整理了关于 TCP 三次握手和四次挥手的面试题型 ,跟大家一起探讨探讨。 TCP 基本认识 TCP 连接建立 TCP 连接断开 Socket 编程 PS:本次文章不涉及 TCP 流量控制、拥塞控制、可靠性传输等方面知识,这些留在下篇哈! 正文 01 TCP 基本认识 瞧瞧 TCP 头格式 我们先来看看 TCP 头的格式,标注颜色的表示与本文关联比较大的字段,其他字段不做详细阐述。 TCP 头格式 序列号 :在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。 用来解决网络包乱序问题。 确认应答号 :指下一次「期望」收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。 用来解决不丢包的问题。 控制位: ACK :该位为 1 时,「确认应答」的字段变为有效,TCP 规定除了最初建立连接时的 SYN 包之外该位必须设置为 1 。 RST :该位为

ioctl() fcntl() setsockopt() ioctlsocket() 用法

心已入冬 提交于 2019-12-10 15:59:15
int ioctl(int d, int request, ...); 后续是否有参数根据第二个参数request的需要来决定。 ioctl用于硬件设备I/O通道控制,控制命令与参数都与设备高度相关,通常也与系统高度相关。 int fcntl(int fd, int cmd, ... /* arg */ );后续是否有参数根据第二个参数cmd的需要来决定。这点两者相同。 操作控制的对象是: 文件描述符。 ioctl()是底层的系统调用(system call),所以跨平台特性不好。 而fcntl则是被封装的函数,各个OS都是支持的。 在网络socket中,他们作用大概相似。 例如都可以设置socket的是否允许非阻塞模式,不过设置方式上略有不同: int socketfd = .....; fcntl(sockfd, F_SETFL,fcntl(sockfd, F_GETFL, 0) |O_NONBLOCK); ioctl(sockfd, FIONBIO,1); 1:非阻塞0:阻塞 int setsockopt(int sockfd, int level, int optname, void *optval,socklen_t *optlen); 设置套接字选项.只能操作套接字。 sockfd: 套接字 level: 协议层 SOL_SOCKET/IPPROTO_IP/IPPRO