
网络编程
文章平均质量分 61
左耳朵猫
这个作者很懒,什么都没留下…
展开
-
TCP、UDP比较
TCPUDP本质面向连接的流传输控制协议面向无连接用户数据包协议可靠性可靠本身不可靠性能性能低性能相对高开销协议复杂,开销高协议相对简单,开销低适用地方强调高可靠性不太要求性能原创 2017-06-20 22:07:29 · 308 阅读 · 0 评论 -
TCP流量控制和拥塞控制
一句话总结:通过滑动窗口进行流量控制,接收端根据自己资源情况改变发送端的窗口上限,即是改变滑动窗口的大小;拥塞控制通过慢启动和拥塞避免,以及快速重传和快速恢复来实现,慢启动以指数不断增大拥塞窗口大小,到达或超过慢开始阈值ssthresh,拥塞窗口cwnd执行拥塞避免转为线性增长,发生超时后,ssthresh=swnd/2,cwnd=1;快速重传为提高效率不再等待超时后重发,而是当接收方原创 2017-10-22 15:45:00 · 430 阅读 · 0 评论 -
SOCKET中send和recv函数真正在做什么
一句话总结:send和recv仅仅是在内核空间和用户空间之间拷贝数据,而发送数据是协议的事情。send:将数据拷贝到内核发送缓冲区,拷贝成功返回拷贝的字节数。如果协议正在发送缓冲区的数据,则等待;如果缓冲区剩余空间不足,则等待。recv:将数据用内核接收缓冲区拷贝到用户空间,拷贝成功返回拷贝的字节数。如果协议正在接收数据,则等待;如果接收缓冲区没有数据,则等待。send发送一次数据,r原创 2017-10-23 12:51:53 · 1024 阅读 · 0 评论 -
聊聊Linux fork多进程并发服务器模型
一句话总结:主进程负责监听,子进程负责处理事务;注意父子进程共享socket句柄,关闭进程不用的句柄,避免句柄泄露;注意给子进程收尸,避免僵尸进程。有点晚了,就简单上个模型吧//子进程善后void sigChildFun(int sigNO) { pid_t pid; int stat; while((pid = waitpid(-1, &stat原创 2017-10-25 00:13:32 · 775 阅读 · 0 评论 -
TCP粘包
一句话总结:通过自定义协议判断每个包的大小来避免粘包。先看个简单的:服务端:#include #include #include #include #include #include #include using namespace std;int main(){ struct sockaddr_in serAddr; int listenSock, cnntS原创 2017-10-25 11:54:01 · 256 阅读 · 0 评论 -
连接一个没有监听的端口结果会怎样
一句话总结:消息可达的情况下服务端直接抛个RST过来服务端:#include #include #include #include #include #include #include using namespace std;int main(){ struct sockaddr_in serAddr; int listenSock, cnntSock;原创 2017-10-25 14:28:41 · 4061 阅读 · 0 评论 -
聊聊服务端异常终止的问题
一句话总结:服务端还有消息没有接受异常终止则发送RST给客户端,客户端再发送消息则失败;服务端:#include #include #include #include #include #include #include using namespace std;int main(){ struct sockaddr_in serAddr; int liste原创 2017-10-25 15:52:29 · 1596 阅读 · 0 评论 -
聊聊TCP超时
一句话总结:防止阻塞在那里,任务该往下走的时候还要往下走。1、接收超时,等待N秒,还是没有消息,那就接着往下走服务端#include #include #include #include #include #include #include using namespace std;int main(){ struct sockaddr_in serAddr; i原创 2017-10-25 22:01:30 · 703 阅读 · 0 评论 -
聊聊epoll的水平触发和边缘触发
一句话总结:水平触发下epoll_wait在文件描述符没有读写完会一直触发,而边缘触发是可读写时触发一次。类别情况水平触发的非阻塞监听sockfd高并发情况下,fd一个一个取,不会漏掉边缘触发的非阻塞监听sockfd高并发情况下可能会有漏掉的情况水平触发的阻塞连接connfd原创 2017-11-04 09:50:47 · 1353 阅读 · 1 评论 -
聊聊TCP四次挥手中的timewait
一句话总结:保证双方正常关闭、废弃存在于路由上的旧信息。下面假设A是主动关闭方,B是被动关闭方。1、time wait什么时候出现当A发送FIN给B时,进入FIN_WAIT_1,B接收到FIN后发给A一个ACK,进入CLOSE_WAIT当A接收到B的ACK后进入FIN_WAIT_2B进入CLOSE_WAIT后没有数据发送,则发送FIN,进入LAST_ACKA接收到B的F原创 2017-10-20 10:33:02 · 666 阅读 · 0 评论 -
tcpdump抓包实例
一句话总结:熟练使用常用的参数,不满足就去man下,加上分析工具wireshark/fiddler如虎添翼。无聊的tcp/ip协议结合实战会变得有趣。常用:sudo tcpdump -iany port 1234 -Xnlps0sudo tcpdump -iany port 1234 -xnlps0sudo tcpdump -iany port 1234 -Anlps0sudo原创 2017-10-22 15:38:05 · 1012 阅读 · 0 评论 -
tcpdump抓包
一句话总结:熟练使用常用的参数,不满足就去man下,加上分析工具wireshark/fiddler如虎添翼。无聊的tcp/ip协议结合实战会变得有趣。常用:sudo tcpdump -iany port 1234 -Xnlps0sudo tcpdump -iany port 1234 -xnlps0sudo tcpdump -iany port 1234 -Anlps0sudo原创 2017-10-22 10:21:46 · 404 阅读 · 0 评论 -
tcpdump抓包分析利器——wireshark
wireshark有mac版和win版,fiddler有win版。下面看下wireshark怎么用先抓点包zjy@ubuntu:~$ sudo tcpdump -iany -w dump.pcaptcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes原创 2017-10-22 11:42:30 · 380 阅读 · 0 评论 -
epoll——高并发的功臣
一句话总结:减少遍历fd、加速fd从用户态到内核态的拷贝,一切皆为提升性能。与IOCP有异曲同工之妙。说说select和poll,没有具体研究过,基本过程是每次调用select/poll都会将fd集合从用户态拷贝到内核态,在内核中需要全遍历一遍,都是开销啊,而且对fd的数目是有限制的(默认是1024)。说说epoll,相对于前面两者,通过内存共享mmap加速了fd集合的拷贝且仅拷贝原创 2017-07-16 16:09:20 · 350 阅读 · 0 评论 -
TCP协议疑难杂症全景解析
转载于:http://blog.youkuaiyun.com/dog250/article/details/6612496说明:1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的3).针对对象:对TCP已经有了全面了解的人。因为本文不会解析TCP头里面的每一个字段或者3次握手的细节,也不转载 2017-07-17 11:07:00 · 380 阅读 · 0 评论 -
TCP建立/关闭连接时握手过程中的状态情况
一句话总结:原创 2017-06-20 22:55:09 · 1823 阅读 · 0 评论 -
SIGPIPE信号导致进程退出
一句话总结:网络编程中需要处理SIGPIPE信号,防止进程退出。客户端关闭套接字后,如果服务器调用一次write,服务器会接收到RST segment(TCP传输层),如果服务器再次调用write,这个时候就会产品SIGPIPE信号(在无读者的管道上写),导致整个进程退出。如果我们不想服务器退出,需要忽略SIGPIPE,交给系统处理,如: signal(SIGPIPE,SIG_IG原创 2017-08-17 15:46:29 · 497 阅读 · 0 评论 -
网络编程文件描述符超过限制的解决办法
一句话总结:采用一个空闲的文件描述符来解决accept函数头文件:函数形式int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);返回值成功:返回新的套接字文件描述符失败:返回-1,记录错误信息errnoEAGAIN:套接字处于非阻塞状态,当前原创 2017-08-17 18:55:31 · 1289 阅读 · 0 评论 -
socket跟TCP/IP 的关系,单台服务器上的并发TCP连接数可以有多少
http://blog.youkuaiyun.com/huangjin0507/article/details/52396621常识一:文件句柄限制在Linux下编写网络服务器程序的朋友肯定都知道每一个tcp连接都要占一个文件描述符,一旦这个文件描述符使用完了,新的连接到来返回给我们的错误是“Socket/File:Can'topen so many files”。转载 2017-08-30 10:23:36 · 1183 阅读 · 0 评论 -
TCP长连接和Keepalive详解
http://blog.youkuaiyun.com/huangjin0507/article/details/52396580TCP协议中有长连接和短连接之分。短连接在数据包发送完成后就会自己断开,长连接在发包完毕后,会在一定的时间内保持连接,即我们通常所说的Keepalive(存活定时器)功能。默认的Keepalive超时需要7,200,000 milliseconds,即2小时,探测转载 2017-08-30 10:27:42 · 17351 阅读 · 0 评论 -
Linux tcpdump命令详解
转载于:http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html简介用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议转载 2017-10-20 10:12:21 · 240 阅读 · 0 评论 -
在TCP半开连接上发送数据,结果怎样?
问题描述:假设现在有一个TCP长连接A和B,B端突然遭遇停电断网等突发事件close掉了,此时处于半开连接状态,假设不考虑心跳包机制、A端的发送内核缓冲区没有满,此时A端写数据发送会成功吗?为什么?肯定会成功,send函数跟实际发送其实没啥关系,send函数更确切的含义是copy_data_from_userspace_to_kernelspace,只有内核空间有富余就会成功,不过很显然B端是原创 2017-10-20 11:03:33 · 730 阅读 · 0 评论 -
阻塞模式下socket连接connect超时后长达75秒,如何避免
一句话总结:设置非阻塞,用select等待一段时间看是否连接成功,连接成功再设回阻塞模式。注意select第一个参数一定要加1,否则描述符刚好不在集合当中,会出现超时返回0不可读不可写但send、recv正常的情况。server:#include #include #include #include #include #include #include #incl原创 2017-11-04 16:02:40 · 2954 阅读 · 0 评论