网络编程
cft56200_ln
格拉德韦尔在《异数》:并非天资超人一等,而是付出了持续不断的努力。只要经过1万小时的锤炼,任何人都能从平凡变成超凡”。要成为某个领域的专家,需要10000小时:如果每天工作八个小时,一周工作五天,那么成为一个领域的专家至少需要五年。
展开
-
linux c setsockopt 设置ttl
TTLTTL是 Time To Live的缩写,该字段指定IP包被路由器丢弃之前允许通过的最大网段数量。TTL是IPv4包头的一个8 bit字段.在IPv4包头中TTL是一个8 bit字段,它位于IPv4包的第9个字节。如下图所示,每一行表示 32 bit(4字节),位从0开始编号,即0~31。TTL的作用是限制IP数据包在计算机网络中的存在的时间。TTL的最大值是255,TTL的一个推荐值是64.虽然TTL从字面上翻译,是可以存活的时间,但实际上TTL是IP数据包在计算机网..原创 2021-12-21 09:54:28 · 2337 阅读 · 0 评论 -
Linux中arp表的老化机制
转发网址:https://www.cnblogs.com/lsgxeva/p/13749751.htmlLinux内核网络协议栈中自动维护着一堆网络协议,这堆网络协议在内核中也是不同的存在,对于arp,Linux内核就提供了一种缓存机制来维护这张表。实际的使用场景是,网络设备维护的arp表与内核维护的arp表相同步,一旦有变化,便通过钩子通知到上层的arp模块。但对于网络设备的arp模块来说,还需要实现一个arp老化时间的功能,这个功能的实现便也依靠了linux内核的arp表老化。内核是如何维护转载 2021-08-20 10:05:58 · 3428 阅读 · 0 评论 -
为什么tcp的TIME_WAIT状态要维持2MSL
https://cloud.tencent.com/developer/article/1450264?from=14588原创 2021-08-15 09:40:45 · 104 阅读 · 0 评论 -
网络编程的内存分配问题,内存一直是编程中最麻烦的问题
(1).第一道,我们在读数据的时候,一般都需要给应用程序最终缓冲区分配大小,这个大小有什么讲究吗?有讲究的。如果分配的太小,那就会频繁的从用户太切换到内核态,这样其实非常损耗CPU的时间。同时如果设置的太大的话,那就会长期阻塞在read或者recv函数上,造成可以先服务或者先完成的内容没完成。再次,也得比实际的数据稍微大一些以免缓冲区溢出,边界的问题要想办法做好的调整。。(2). 第二道,你能分析一下,我们文章中的例子所分配的缓冲是否可以换成动态分配吗?比如调用 malloc 函数来分配原创 2021-05-24 11:30:46 · 74 阅读 · 0 评论 -
UDP 报文最大可以是多大呢
用UDP协议发送时,用sendto函数最大能发送数据的长度为:65535- IP头(20) - UDP头(8)=65507字节。用sendto函数发送数据时,如果发送数据长度大于该值,则函数会返回错误。由于IP有最大MTU,因此,UDP 包的大小应该是 1500 - IP头(20) - UDP头(8) = 1472(Bytes)TCP 包的大小应该是 1500 - IP头(20) - TCP头(20) = 1460 (Bytes)...原创 2021-05-20 09:42:46 · 4831 阅读 · 0 评论 -
禁用 Nagle 算法
有没有发现一个很奇怪的组合,即 Nagle 算法和延时 ACK 的组合。这个组合为什么奇怪呢?我举一个例子你来体会一下。比如,客户端分两次将一个请求发送出去,由于请求的第一部分的报文未被确认,Nagle 算法开始起作用;同时延时 ACK 在服务器端起作用,假设延时时间为 200ms,服务器等待 200ms 后,对请求的第一部分进行确认;接下来客户端收到了确认后,Nagle 算法解除请求第二部分的阻止,让第二部分得以发送出去,服务器端在收到之后,进行处理应答,同时将第二部分的确认捎带发送出去。原创 2021-05-19 14:13:38 · 1829 阅读 · 0 评论 -
糊涂窗口综合症
第一个场景,接收端处理得急不可待,比如刚刚读入了 100 个字节,就告诉发送端:“喂,我已经读走 100 个字节了,你继续发”,在这种情况下,你觉得发送端应该怎么做呢?第一个场景也被叫做糊涂窗口综合症,这个场景需要在接收端进行优化。也就是说,接收端不能在接收缓冲区空出一个很小的部分之后,就急吼吼地向发送端发送窗口更新通知,而是需要在自己的缓冲区大到一个合理的值之后,再向发送端发送窗口更新通知。这个合理的值,由对应的 RFC 规范定义。...原创 2021-05-19 14:09:19 · 77 阅读 · 0 评论 -
在程序设计层面,不要多次频繁地发送小报文,如果有,可以使用 writev 批量发送
其实前面的例子里,如果我们能将一个请求一次性发送过去,而不是分开两部分独立发送,结果会好很多。所以,在写数据之前,将数据合并到缓冲区,批量发送出去,这是一个比较好的做法。不过,有时候数据会存储在两个不同的缓存中,对此,我们可以使用如下的方法来进行数据的读写操作,从而避免 Nagle 算法引发的副作用。ssize_t writev(int filedes, const struct iovec *iov, int iovcnt)ssize_t readv(int filedes, const s原创 2021-05-19 14:02:19 · 194 阅读 · 0 评论 -
服务器端程序中,直接调用exit(0)完成了 FIN 报文的发送,这是为什么呢?为什么不调用 close 函数或 shutdown 函数呢?
为什么调用exit以后不需要调用close,shutdown?因为在调用exit之后进程会退出,而进程相关的所有的资源,文件,内存,信号等内核分配的资源都会被释放,在linux中,一切皆文件,本身socket就是一种文件类型,内核会为每一个打开的文件创建file结构并维护指向改结构的引用计数,每一个进程结构中都会维护本进程打开的文件数组,数组下标就是fd,内容就指向上面的file结构,close本身就可以用来操作所有的文件,做的事就是,删除本进程打开的文件数组中指定的fd项,并把指向的file结构中的引原创 2021-05-18 11:21:42 · 253 阅读 · 0 评论 -
close 和 shutdown 的差别
close 函数首先,我们来看最常见的 close 函数:int close(int sockfd)这个函数很简单,对已连接的套接字执行 close 操作就可以,若成功则为 0,若出错则为 -1。这个函数会对套接字引用计数减一,一旦发现套接字引用计数到 0,就会对套接字进行彻底释放,并且会关闭 TCP 两个方向的数据流。套接字引用计数是什么意思呢?因为套接字可以被多个进程共享,你可以理解为我们给每个套接字都设置了一个积分,如果我们通过 fork 的方式产生子进程,套接字就会积分 +1原创 2021-05-18 11:17:39 · 2703 阅读 · 0 评论 -
SO_LINGER 的设置
英文单词“linger”的意思为停留,我们可以通过设置套接字选项,来设置调用 close 或者 shutdown 关闭连接时的行为。int setsockopt(int sockfd, int level, int optname, const void *optval,socklen_t optlen);struct linger { int l_onoff; /* 0=off, nonzero=on */ int l_linger; /* linger time, P原创 2021-05-18 10:18:57 · 598 阅读 · 0 评论 -
为什么linux selectselect函数对fd有1024的限制
首先,man select,搜索FD_SETSIZE会看到如下的内容An fd_set is a fixed size buffer. Executing FD_CLR() or FD_SET() with a value of fd that is negative or is equal to or larger than FD_SETSIZE will result in undefined behavior. Moreover, POSIX requires fd to be a valid f.原创 2021-05-17 14:44:02 · 1018 阅读 · 0 评论 -
linux 如何查看文件描述符是否被释放
因为linux编程中一切皆是文件,如socket,文本文件,db,flash,等等,尤其是网络编程中server端的socket,经过三次握手以后,经常忘记处理socket,最终导致整个进程的文件描述符耗尽;在linux写程序中经常遇到fd忘记close的情况,也会出现文件描述符耗尽的情况,如下手段可以帮助大家查看文件描述符是否忘记close。1)Linux系统下,所有进程允许...原创 2020-03-11 16:32:07 · 4699 阅读 · 1 评论 -
嵌入式 dns需要的几个库
#add nss and resolv lib for dns " libnss_dns* " " libnss_files* " " libresolv* "原创 2019-09-03 10:28:01 · 472 阅读 · 0 评论 -
基于最大UDP数据报长度和MTU值的思考
最大UDP数据报长度 理论上,IP数据报的最大长度是65535字节,这是由IP首部(图IP协议格式)16比特总长度字段所限制。去除20字节的IP首部(图IP协议格式)和8字节的UDP(图UDP协议格式)首部,UDP数据报中用户的最长长度为65507.但是,大多数实现所提供的长度比这个最大值小。 我们将遇到两个限制因素。 第一,应用程序可能会受到...原创 2019-08-19 09:53:54 · 3035 阅读 · 0 评论 -
Linux 网络故障排查的瑞士军刀 nc
Linux 网络故障排查的瑞士军刀原创:张小方高性能服务器开发5月7日nc即netcat 命令,这个工具在排查网络故障时非常有用,功能非常强大,因而被业绩称为网络界的“瑞士军刀”,请读者务必掌握。默认系统是没有这个命令的,你需要安装一下,安装方法:yuminstallncnc命令常见的用法是模拟一个服务器程序被其他客户端连接,或者模拟一个客户端连接其他服务器,连...转载 2019-08-09 08:36:34 · 301 阅读 · 0 评论 -
linux 性能监控命令 之 uptime free df
1.1 监控CPU使用情况---uptime命令 该命令的描述为:打印当前时间,系统已经运行了多久,当前登录用户数以及系统平均负载。 $ uptime 15:18:39 up 70 days, 1:34, 14 users, load average: 0.88, 0.79, 0.62 从上面的信息可以看出,当前系统时间为15点18分39秒,系原创 2016-10-12 15:18:42 · 553 阅读 · 0 评论 -
让nginx支持文件上传的几种模式
让nginx支持文件上传的几种模式2013-07-30 16:05 21244人阅读 评论(2) 收藏 举报版权声明:本文为博主原创文章,未经博主允许不得转载。文件上传的几种不同语言和不同方法的总结。第一种模式 : PHP 语言来处理这个模式比较简单, 用的人也是最多的, 类似的还有用 .net 来实现, jsp来实现, 都是处理表单。只有语转载 2016-10-17 13:18:10 · 2797 阅读 · 0 评论 -
Linux Socket过程详细解释(包括三次握手建立连接,四次握手断开连接)
Linux Socket过程详细解释(包括三次握手建立连接,四次握手断开连接)我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web 服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型 有哪些?还有socket的基本函数,这些都是本文想介绍的。本文的转载 2016-11-10 13:03:59 · 420 阅读 · 0 评论 -
struct--iphdr -- IP头部
struct--iphdr -- IP头部 sk_buff->iphdr/usr/src/linux-2.6.19/include/linux/ip.hstruct iphdr {#if defined(__LITTLE_ENDIAN_BITFIELD) __u8 ihl:4, version:4;#eli转载 2016-10-08 09:24:43 · 8116 阅读 · 0 评论 -
Linux内核--网络栈实现分析(一)--网络栈初始化
Linux内核--网络栈实现分析(一)--网络栈初始化 2013-04-10 18:44:26| 分类:linux-NET |举报|字号 订阅 下载LOFTER我的照片书 | 本文分析基于内核Linux Kernel 1.2.13原创作品,转载请标明htt转载 2016-10-08 09:30:23 · 228 阅读 · 0 评论 -
Linux内核--网络栈实现分析(二)--数据包的传递过程(上)
Linux内核--网络栈实现分析(二)--数据包的传递过程(上) 2013-04-10 19:34:58| 分类: linux-NET |举报 |字号 订阅 下载LOFTER我的照片书 | 本文分析基于Linux Kernel 1.2.13原创作品,转载请标明http://blog转载 2016-10-08 09:33:05 · 655 阅读 · 0 评论 -
ip_rcv 分析
ip_rcv 分析 2013-04-13 11:40:00| 分类: linux-NET |举报 |字号 订阅 下载LOFTER我的照片书 | /* * Main IP Receive routine. */int ip_rcv(struct sk_buff *skb,转载 2016-10-08 09:34:34 · 898 阅读 · 0 评论 -
ip_rcv_finish
ip_rcv_finish 2013-04-20 14:37:14| 分类:linux-NET |举报|字号 订阅 下载LOFTER我的照片书 | 执行完钩子函数后,IP数据包被传送到ip_rcv_finish做进一步处理,这个函数主要功能是做路由选择(ker转载 2016-10-08 09:35:50 · 574 阅读 · 0 评论 -
struct--tcphdr
Linux-2.6.21.1 网络函数调用流程 tcp_v4_rcv()函数流程分析struct--tcphdr 2013-04-20 15:08:50| 分类:linux-NET |举报|字号 订阅 下载LOFTER我的照片书 | s转载 2016-10-08 09:38:35 · 325 阅读 · 0 评论 -
FastCGI学习总结
作者: Jimmy Cao,2008/9 All Rights Reserved 共同学习进步,转载请注明什么是FastCGIFastCGI :Fast Common Gateway Interface(快速通用网关接口),它是CGI的增强版。FastCGI是一个快速、开放和安全的web server接口,解决了传统CGI的性能问题,却又没有带来编程的复杂性。老的CGI程序可以很轻易...转载 2018-07-24 11:03:48 · 675 阅读 · 0 评论 -
lighttpd 各种配置详细文档
网址:http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs网址内容链接Documentation Overview¶目录 Documentation Overview Core Features Modules Modules (1.5 only (abandoned)) Internals Modules ...原创 2018-07-24 11:05:28 · 4730 阅读 · 0 评论 -
fastcgi c/c++多线程编程
源代码/* * threaded.c -- A simple multi-threaded FastCGI application. */#ifndef lintstatic const char rcsid[] = "$Id: threaded.c,v 1.9 2001/11/20 03:23:21 robs Exp $";#endif /* not lint */#incl...原创 2018-07-30 16:13:47 · 894 阅读 · 0 评论 -
Linux网络编程 之 UDP 组播实例
一个很简单udp 组播通信的例子,分别为服务器端和客户端的代码。 1、服务器端代码 (multi_udp_server.c) #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <std...转载 2019-01-29 13:35:50 · 624 阅读 · 0 评论 -
用Linux C语言获取上传和下载的实时网速
linux c获取实时网速其实就是读取/proc/net/dev下文件下产生的网口流量信息,如下图所示直接上代码 注意这里显示的是字节数大B转化为实际网速需要乘以8 小B#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h> #...原创 2019-04-28 09:50:57 · 2354 阅读 · 1 评论 -
操作组播路由表
/**操作组播路由表 参数flag true表示添加路由表 false 表示删除路由表*/static int _op_multicast_route_list(star_s8 *multi_ip,star_bool flag){ FILE *fp = NULL; star_s8 tmp_buf[64]; star_s8 eth_in...原创 2019-06-11 16:19:49 · 1924 阅读 · 0 评论 -
linux route命令的使用详解
linux route命令的使用详解route命令用于显示和操作IP路由表。要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。在Linux系统中,设置路由通常是 为了解决以下问题:该Linux系统在一个局域网中,局域网中有一个网关,能够让机器访问Internet,那么就需要将这台机器的IP地址设置为 Linux机器的默认路由。要注意的是,直接在命令转载 2016-10-17 09:50:18 · 340 阅读 · 0 评论