![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
TCP-IP
文章平均质量分 60
qq_20363225
这个作者很懒,什么都没留下…
展开
-
Linux高性能服务器编程学习记录——十五、进程池与线程池
这一章实现了一个半同步/半异步的进程池(主进程只负责监听socket,所有连接socket,以及连接socket上的数据操作由子进程负责),和一个半同步/半反应堆的线程池,主线程负责监听socket和所有连接socket上的IO事件,子线程都阻塞在工作队列中,以竞争的方式从队列中取任务,然后处理。半同步/半异步的进程池实现processpool.h#ifndef PROCESSPOOL_H#define PROCESSPOOL_H#include <sys/types.h>#inc原创 2022-01-10 14:00:04 · 528 阅读 · 1 评论 -
SO_LINGER选项的作用
SO_LINGER选项用于设置函数close()关闭TCP连接时的行为。缺省close()的行为是,如果有数据残留在socket发送缓冲区中则系统将继续发送这些数据给对方,等待被确认,然后返回。利用此选项,可以将此缺省行为设置为以下两种:a.立即关闭该连接,通过发送RST分组(而不是用正常的FIN|ACK|FIN|ACK四个分组)来关闭该连接。至于发送缓冲区中如果有未发送完的数据,则丢弃。主动关闭一方的TCP状态则跳过TIMEWAIT,直接进入CLOSED。网上很多人想利用这一点来解决服务器上出现大转载 2022-01-06 20:59:07 · 395 阅读 · 0 评论 -
Linux高性能服务器编程学习记录——十三、多进程编程
1、fork系统调用Linux下创建新进程的系统调用是fork#include <sys/types.h>#include <unistd.h>pid fork(void);该调用返回两次,父进程中返回子进程的pid,子进程中返回0,失败返回-1,并设置errno。fork复制当前进程,在内核进程表中创建一个新的进程表项。新的进程表项有很多属性和原进程相同,比如堆指针、栈指针和标志寄存器的值。也有一些属性被赋予新的值,比如新进程的ppid会被设为原进程的pid,信号位图原创 2021-12-30 14:00:45 · 623 阅读 · 0 评论 -
Linux高性能服务器编程学习记录——十一、定时器
这一章其实是对服务器定时器管理的几种实现方案,包括有序链表、时间轮以及小根堆。内容不再详述,下面是摘录自原文的源码。代码清单11-2:升序定时器链表#ifndef LST_TIMER#define LST_TIMER#include <time.h>#define BUFFER_SIZE 64class util_timer;struct client_data{ struct sockaddr_in address; int sockfd; char buf[BUF原创 2021-12-24 15:24:56 · 581 阅读 · 0 评论 -
Linux高性能服务器编程学习记录——十、信号
1、发送信号Linux下,一个进程给其他进程发送信号的API是kill函数#include <sys/types.h>#include <signal.h>int kill(pid_t pid, int sig);该函数把信号sig发送给由pid指定的目标进程,pid的含义如下Linux定义的信号值都大于0,如果sig取值为0,则kill函数不发送任何信号。2、信号处理方式目标进程收到信号后,需要定义一个接收函数来处理,信号处理函数原型如下#include &l原创 2021-12-23 14:31:57 · 1152 阅读 · 0 评论 -
Linux高性能服务器编程学习记录——九、I/O复用
在不使用I/O复用的技术下,如果要同时监听多个fd上的事件得使用多个线程(或进程,下同),每个线程单独负责一个fd上事件。而I/O复用技术可以同时监听多个fd,即在一个线程里监听多个fd的事件。另外I/O本身是阻塞的,在它返回后,如果要实现并发,还是得使用多进程或多线程的变成手段。Linux下实现的I/O复用的系统调用主要有select、poll和epoll。1、select系统调用APIselect系统调用的用途是在一段指定时间内,监听用户感兴趣的文件描述符上的可读、可写和异常等事件。#incl原创 2021-12-21 13:36:53 · 291 阅读 · 0 评论 -
Linux高性能服务器编程学习记录——八、高性能服务器程序框架
1、服务器模型目前主要是C/S(client/server)模型和P2P(peer2peer)模型,不多说。2、服务器编程框架服务器的基本框架如下图:I/O处理单元一般作为接入服务器,负责处理与客户端的连接,读写网络数据,实现负载均衡逻辑单元,顾名思义,就是处理业务的模块网络存储单元一般指数据库请求队列是各模块之间的通信方式,如果是服务器机群的话,一般是TCP永久连接3、I/O模型辛辛苦苦工作了一天,回到家发现女友在打游戏,而没给你做饭,你很生(无)气(语),呵(央)斥(求)她去给你做饭原创 2021-12-11 10:56:29 · 390 阅读 · 0 评论 -
Linux高性能服务器编程学习记录——六、高级I/O函数
1、创建文件描述符的函数pipe函数#include <unistd.h>int pipe(int fd[2]);成功返回0,并将一堆打开的文件描述符填入fd[],用fd[0]从管道读,用fd[1]往管道写,不能互换。失败返回-1,并设置errno。自Linux2.6.11后,管道容量大小默认65536,可以通过fcntl修改。socketpair函数#include <sys/types.h>#include <sys/socket.h>int so原创 2021-12-01 20:31:39 · 228 阅读 · 0 评论 -
Linux高性能服务器编程学习记录——五、linux网络编程基础api
1、网络字节序字节序点这里2、socket地址结构体TCP/IP协议族有sockaddr_in和sockaddr_in6两个专用的socket地址结构体,分别用于IPv4和IPv6。struct sockaddr_in{ sa_family_t sin_family; //地址族:AF_INET u_int16_t sin_port; //端口号,要用网络字节序表示 struct in_addr sin_addr; //IPv4地址结构体 见下面};struct in_addr{原创 2021-11-29 21:25:23 · 1987 阅读 · 0 评论 -
字节序(大小端)问题
现代CPU的累加器一次至少能加载4个字节,即一个整数。这4个字节再内存中的排序将影响它被累加器装载成的整数的值。这就是字节序问题。字节序分为大端序与小端序,即big endian、little endian。大端序是指一个整数的高位字节存储在内存地址的低地址处,低位字节存储在内存高地址处。小端序正好相反。下面看0x0102在两种内存结构中的存储方式。0x0102占两个字节:高位字节 01:0000 0001,低位字节02:0000 0010内存地址位: 低 ----------------&g原创 2021-11-23 14:11:43 · 2268 阅读 · 0 评论 -
TCP/IP详解:TCP——保活机制
1、保活时间、保活时间间隔、保活探测数如果在一段时间(保活时间:keepalive time)内连接处于非活动状态,开启保活功能的一端奖项对方发送一个保活探测报文。如果发送端没有收到响应报文,那么经过一个已经提前设置好的保活时间间隔(keepalive interval),将继续发送保活探测报文,直到发送探测报文的次数达到保活探测数(keepalive probe),这时对方主机将被确认为不可到达,连接将被中断。保活探测报文为一个空报文段(或只包含一个字节)。他的序列号等于对方主机发送的ACK报文的最大序原创 2021-11-18 14:00:40 · 2568 阅读 · 0 评论 -
TCP/IP详解:TCP——拥塞控制
TCP/IP详解:TCP——拥塞控制1、拥塞检测没有一个精确的方法或者说一个明确的信号告知发送方拥塞状况是否已发生。通常看是否有丢包情况来推断是否出现拥塞。在TCP中,丢包也被用作判断拥塞发生与否的指标,用来衡量是否实施相应的响应措施。 注意:在当今的有线网络中造成丢包的主要原因是拥塞,而在无限网络中却是传输和接收错误。二、使用步骤1.引入库代码如下(示例):import numpy as npimport pandas as pdimport matplotlib.pyplot as原创 2021-11-18 09:23:53 · 2729 阅读 · 0 评论 -
TCP/IP详解:TCP——数据流与窗口管理
1、PSH位PSH标志位通常表示发送端缓存为空,也就是说,当PSH置位的数据包发送完成后,发送端没有其他数据包需要传输。2、延时确认很多情况下TCP并不是对每个到来的数据包都返回ACK,而是在累计几个包后返回一个ACK,实践中最大时延一般取200ms,对于批量数据传输一般是2:1的比例,ACK计时器超时时间以及超市前在传的ACK数目都可以配置。3、Nagle算法Nagle算法要求,当一个TCP连接中有在传数据(即那些已发送但还未经确认的数据),小的报文段(长度小于SMSS)就不能被发送,知道所原创 2021-11-06 13:24:06 · 1048 阅读 · 0 评论 -
TCP选项(持续更新)
很多初学者在学习TCP协议是比较关注的是TCP头部中的各字段,往往会忽略TCP选项。本文将梳理下TCP选项中个字段的含义。1、最大段大小MSS(Maxitum Segment Size)种类号2,长度4(Bytes)最大段大小是指TCP协议所允许的从对方接收到的最大报文段,因此这也是通信双方在数据交换过程中能够使用的最大报文段。这个值是在建立tcp连接的三次握手中双端协商得到的。p1发送SYN包来请求建立连接,在这个包中,mss选项字段会填充自己一端能接收的mss值,典型值为1460,p2在回应的原创 2021-11-06 11:24:12 · 398 阅读 · 0 评论 -
TCP/IP详解:TCP——超时和重传
1、TCP一般拥有两套独立机制来完成重传,一是基于时间,即超时重传,而是基于确认信息的构成,即快速重传。2、RTT(Round Trip Time) 往返时延,数据包从发出到收到对应ACK的时间,每一条连接都有独立的RTT。RTO(Retransmission Time Out)重传超时,即超时时间。RTT和RTO都是动态变化的。3、超时重传的时间间隔是不一样的,一般采用的是二进制指数退避策略,比如第一次间隔3s,第二次6s,然后12s、24s ...4、计算RTO的经典方法最初的TCP规.原创 2021-10-31 15:26:01 · 2119 阅读 · 0 评论 -
TCP/IP详解:TCP——连接管理
1、每一个TCP连接由一个四元组构成,更准确的说是一对端点或套接字。2、连接建立的过程称为三次握手,三次握手的目的不仅在于让通信双方了解一个连接正在建立,还在于利用数据报的选项来承载特殊的信息,交换初始序列号tcp连接建立和关闭的过程3、TCP半关闭由于一条tcp连接支持双向通信,因此存在一种情况:我还可以接收你发的数据,但我不再给你发送数据(数据确认包还是会发送的)。这种情况称为半关闭,套接字的shutdown()函数实现这种操作。4、同时打开与关闭同时打开与关闭是发生在同..原创 2021-10-26 13:49:53 · 822 阅读 · 0 评论 -
TCP/IP详解:TCP——初步
1、ARQ(Automatic RepeatRequest自动重复请求)和重传一个直接处理分组丢失或比特差错的方法是重发分组,那么发送方如何判定需要重发呢?引入接收方的确认机制ACK(Acknowledgment)。接收方在接收到一个正确的分组后给发送方发送一个ACK。于是又引入了三个问题:发送方对一个ACK应该等待多长时间 如果ACK丢失了怎么办 如果分组被接受了,里面有错怎么办问题1比较复杂,之后讨论。对于问题2,发送方不能轻易地把这种情况和分组丢失了区分开来,他只能再次发送原分组。问题.原创 2021-10-06 13:57:44 · 158 阅读 · 0 评论 -
TCP/IP详解:用户数据报协议(UDP)和IP分片
1、UDP8字节头部其中校验和字段是对包含了IP头部中的源和目的IP地址字段的udp伪头部计算得到的。包含IP地址的伪头部只在计算校验和的时候用到,实际传送的udp头部只有8个字节。另外,udp头部中的长度字段是冗余的,udp的长度完全可以通过ip数据报总长减去ip数据报头部长度得到。2、udp校验和计算时覆盖的字段要注意的是在IPv4的udp中,校验和是可选的(但是强烈建议),而在IPv6中是强制的,因为IPv6的IP层没有头部校验和。当一个udp的校验差错被检测到时,这个数据报.原创 2021-10-05 15:53:08 · 1256 阅读 · 0 评论 -
TCP\IP详解——第4章:ARP:地址解析协议
1、ARP提供IP地址到对应硬件地址的动态映射,RARP正好相反2、ARP请求过程数据在网络中传输时都是要把目的IP地址转为硬件地址的,这件事由ARP来完成。ARP会在网络上广播一个称为ARP请求的以太网数据帧,来询问“这个目的IP地址是谁的,请把你的硬件地址告诉我”。目的主机(或路由器)在收到ARP请求后,回复一个ARP应答告知自己的硬件地址,这样ARP就完成了目的IP到目的硬件地址的转换3、ARP高速缓存高速缓存存放了最近的IP地址到硬件地址的映射记录,这项记录的有效时间一般被设为20分原创 2021-09-05 16:49:08 · 154 阅读 · 0 评论 -
TCP\IP详解——第3章:IP:网际协议
1、IP仅提供最好的传输服务,不保证数据报能否成功到达目的地。任何要求的可靠性必须由上层来做(如TCP)2、IP首部普通的IP首部占20字节,除非含有选项字段。下图是IP数据报的格式(图片来自TCP\IP详解卷1)3、IP首部校验和先把检验和字段置为0,然后对首部中每个16位进行二进制反码求和(整个首部堪称是一串16bit的字组成),结果存到检验和字段中。收到这份ip数据报后同样再对每个16bit反码求和,结果应该为全1(二进制),否则丢弃数据报。看下面例子45 00 00...原创 2021-09-05 14:45:14 · 144 阅读 · 0 评论 -
TCP\IP详解——第2章:链路层
1、环回接口大多数系统把IP地址127.0.0.1分配给这个接口,并命名为localhost,一个传给环回接口的数据报不能在任何网络上出现传给环回地址(一般是127.0.0.1)的任何数据均作为IP输入。 传给广播地址或多播地址的数据报复制一份传给环回接口,然后送到以太网上。这是 因为广播传送和多播传送的定义(第 12章)包含主机本身。 任何传给该主机I P地址的数据均送到环回接口 ...原创 2021-09-02 19:31:03 · 71 阅读 · 0 评论 -
TCP\IP详解——第1章:概述
1、TCP\IP四层协议系统应用层(Telnet、FTP、HTTP等) 传输层(TCP、UDP) 网络层(IP、ICMP、IGMP) 链路层(物理层)2、五类互联网地址格式原创 2021-09-02 13:39:12 · 62 阅读 · 0 评论 -
互联网5层模型入门--通俗易懂
转自:http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.htmlhttp://www.ruanyifeng.com/blog/2012/06/internet_protocol_suite_part_ii.html这是我见过的介绍计算机网络5层架构最清楚的讲解,对于学习计算机网络5层架构一定是不可缺少的一篇文...转载 2018-03-26 14:50:23 · 7534 阅读 · 0 评论 -
MSS与MTU的关系
MTU:maximum transmission unit,最大传输单元,由硬件规定,如以太网的MTU为1500字节。MSS:maximum segment size,最大分节大小,为TCP数据包每次传输的最大数据分段大小,一般由发送端向对端TCP通知对端在每个分节中能发送的最大TCP数据。MSS值为MTU值减去IPv4 Header(20 Byte)和TCP header(20转载 2017-08-29 20:08:58 · 247 阅读 · 0 评论 -
网络中的A类、B类、C类地址的划分
IP地址有三种基本类型,由网络号的第一组数字来表示。A类地址的第一组数字为1~126。注意,数字0和 127不作为A类地址,数字127保留给内部回送函数,而数字0则表示该地址是本地宿主机,不能传送。B类地址的第一组数字为128~191。C类地址的第一组数字为192~223。例如:我校的网络号是202.206.64–79 , 它的第一组数字为202,因此202.206.64.34是C类地址。而转载 2017-08-22 17:10:51 · 15137 阅读 · 0 评论