
Linux网络编程
文章平均质量分 65
lp525110627
这个作者很懒,什么都没留下…
展开
-
Linux网络编程中常见的陷阱
1、谨慎处理Linux信号量和错误号首先介绍两个很常用网络编程的用法,(1)很多套接字程序中为了防止进程收到SIGPIPE信号时崩溃往往会在进程中设置忽略信号SIGPIPE。(2)但是很多程序为了提高send的成功率对send做了二次封装,即对send的返回值进行判断,如果返回-1则进一步对Linux系统错误号errno进行判断,如果errno==EINTR则继续send原创 2016-11-26 17:29:23 · 880 阅读 · 0 评论 -
阻塞模式和非阻塞模式下send、sendto、recv、recvfrom的表现
首先socket在默认情况下是阻塞状态的(未指异步操作以及其它一些特殊用途下,直接默认为非阻塞),这就使得发送以及接收操作处于阻塞的状态,即调用不会立即返回,而是进入睡眠等待操作完成。下面把讨论点分为发送以及接收。 一.发送选用send(这里特指TCP)以及sendto(这里特指UDP)来描述 首先需要说明的是,不管阻塞还是非阻塞,在发送时都会将数据从应用缓冲区拷贝到内核缓冲区(SO_RCVBU...转载 2018-03-29 15:01:56 · 18505 阅读 · 0 评论 -
TCP连接过程可能出现的错误
连接过程可能出现的错误情况有:(1) 如果客户机TCP协议没有接收到对它的SYN数据段的确认,函数以错误返回,错误类型为ETIMEOUT。通常TCP协议在发送SYN数据段失败之后,会多次发送SYN数据段,在所有的发送都高中失败之后,函数以错误返回。注:SYN(synchronize)位:请求连接。TCP用这种数据段向对方TCP协议请求建立连接。在这个数据段中,TCP协议将它选择的初始序列号通知对方...转载 2018-03-30 12:01:51 · 9938 阅读 · 0 评论 -
TCP定时器
TCP为每条连接建立七个定时器:1、 连接建立定时器在发送SYN报文段建立一条新连接时启动。如果没有在75秒内收到响 应,连接建立将中止。当TCP实例将其状态从LISTEN更改为SYN_RECV的时侯就会使用这一计时器.服务端的TCP实例最初会等待一个ACK三秒钟.如果在这一段时间没有ACK到达,则认为该连接请求是过期的. 2、 重传定时器在TCP发送数据时设定.如果定时器已超时而对端的确认还...转载 2017-01-31 13:55:00 · 275 阅读 · 0 评论 -
select、poll和epoll
1、select的描述符大于FD_SETSIZE(1024)时会引起内存越界,poll和epoll不会,虽然连接数有上限,但是很大,1G内存的机器上可以打开10万左右的连接,2G内存的机器可以打开20万左右的连接2、epoll是Linux所特有,而select则应该是POSIX所规定,一般操作系统均有实现,所以select支持的系统更多,可移植性更强。3、select有支持处理信号阻塞和更高时间分...原创 2017-01-31 13:55:53 · 278 阅读 · 0 评论 -
高级TCP/IP编程总结
1、基于连接和无连接协议之间的差异(1)IP层提高了一种高效,不可靠,无连接的服务。TCP和UDP都是基于IP层工作的,那么TCP是如何保证提供一个可靠有连接的呢?TCP基于IP增加了三个服务:第一,TCP提供了校验位,TCP的校验位是强制性字段,基本能保证数据在网络上不会被破坏,实际上UDP(非强制)和IP层(只计算IP头部)都有校验位,链路层以太网还有 CRC32 校验。IP header 和...原创 2018-02-14 16:01:36 · 491 阅读 · 0 评论 -
IP分片和对TCP/UDP的影响
一、IP分片物理网络层一般要限制每次发送数据帧的最大长度。任何时候I P层接收到一份要发送的IP数据报时,它要判断向本地哪个接口发送数据(选路),并查询该接口获得其MTU。IP把MTU与数据报长度进行比较,如果需要则进行分片。分片可以发生在原始发送端主机上,也可以发生在中间路由器上。被分片的数据需要重新组装,重新组装由目的端的IP层来完成,其目的是使分片和重新组装过程对传输层(TCP和UDP)是...原创 2016-11-26 17:24:16 · 1617 阅读 · 0 评论 -
I/O模型
1 、阻塞式IO模型套接字的默认状态均为阻塞,产生阻塞的操作有下面四类(1)读操作read时对于一个阻塞套接字,如果该套接字的接收缓冲区没有数据可读,则该进程将被投入睡眠,直到有数据到达。对于非阻塞套接字如果接收缓冲区没有数据可读则调用会立即返回一个EWOULDBLOCK错误。(2)写操作write时对于一个阻塞套接字,如果该套接字的发送缓冲区没有空间,则该进程将被投入睡眠,直到有空间为止。对于非...原创 2016-11-26 15:37:42 · 333 阅读 · 0 评论 -
syn攻击
1、syn攻击原理在TCP连接的三次握手中第二次握手时,服务器端发送SYN+ACK报文之后,若在规定的超时间之内未收到客户端响应的ACK报文,则服务器端启用重传机制,向客户端重传SYN+ACK报文,直到收到客户端的响应报文或达到服务器端设置的重传次数为止。syn攻击就是利用这种机制,恶意攻击者向被攻击的服务器端在短时间内发送大量仅含有SYN标志的TCP半连接请求报文。一方面,大量的请求报文会使原创 2017-10-09 14:45:45 · 955 阅读 · 0 评论 -
TCP网络编程中RST分节总结
RST为“复位”,它是TCP在某些错误情况下所发出的一种TCP分节。有三个条件可以产生RST: 1), SYN到达某端口但此端口上没有正在监听的服务器。 2), TCP想取消一个已有连接 3), TCP接收了一个根本不存在的连接上的分节。 1. connect 函数返回错误ECONNREFUSED:原创 2016-11-26 15:58:29 · 2634 阅读 · 0 评论 -
TCP状态转换图解析和应用
TCP状态转换分服务端和客户端两部分:一、服务端状态变迁:服务端创建套接字之后调用listen函数将套接字由一个未连接的主动套接字转换为被动套接字,指示内核应接受指向该套接字的连接请求,套接字状态由CLOSE转换为LISTEN,等待客户端连接。所以服务端是被动接收连接的,服务端会先收到SYN,收到之后会立马发送一个SYN+ACK(同一个报文),此时状态转换到SYN_RCVD并等待客户端回复AC...原创 2016-11-26 14:41:00 · 575 阅读 · 0 评论 -
EINTR错误
EINTR错误的产生:当系统阻塞于某个慢系统调用的一个进程捕获某个信号且相应信号处理函数返回时,该系统调用可能返回一个EINTR错误。例如:在socket服务器端,设置了信号捕获机制,有子进程,当在父进程阻塞于慢系统调用时由父进程捕获到了一个有效信号时,内核会致使accept返回一个EINTR错误(被中断的系统调用)。此类慢系统调用包括永远阻塞的系统调用即调用有可能永远无法返回,多数网络支原创 2016-11-26 16:01:31 · 335 阅读 · 0 评论 -
close和shutdown
int close(int sockdf);行为描述:1、close引发描述符的引用计数减一,当该计数为0时才会关闭套接字。2、close会终止读和写两个方向的数据传送,其行为受SO_LINGER属性影响。(1)若不设置SO_LINGER属性或者关闭SO_LINGER属性其默认行为为:终止读和写两个方向的数据传送,套接字发送缓冲区中的数据将被尝试发送到对端,接收缓原创 2016-11-26 14:52:40 · 288 阅读 · 0 评论 -
linux网络编程中要注意信号量
Linux编程中往往程序会莫名其妙的在write,send等地方退出,如果有这种问题需要注意是不是信号量引起的。网络编程中可以有选择性的使用signal函数处理某些信号,下面介绍几个常用的信号。1、SIGPIPE产生原因:TCP的"四次分手"关闭. TCP是全双工的信道, 可以看作两条单工信道, TCP连接两端的两个端点各负责一条. 当对端调用close时, 本端原创 2016-11-26 14:44:31 · 652 阅读 · 0 评论 -
EAGAIN、EWOULDBLOCK、EINTR与非阻塞
1、EWOULDBLOCK:用于非阻塞模式,不需要重新读或者写。2、EINTR:指操作被中断唤醒,需要重新读/写。3、EAGAIN:在Linux环境下开发经常会碰到很多错误(设置errno),其中EAGAIN是其中比较常见的一个错误(比如用在非阻塞操作中)。从字面上来看,是提示再试一次。这个错误经常出现在当应用程序进行一些非阻塞(non-blocking)操作(对文件或socket)的时候。例如,...转载 2018-03-29 15:09:07 · 4516 阅读 · 0 评论