做家:lvyilong
链接:blog.chinaunix.net/uid--id-.html
码农有道
码农有道高品质手艺文章目录整顿(请戳我)
对于码农有道(请戳我)
在以前参与腾讯口试的时间,被口试官问到了一个题目:“一个tcp效劳端和一个tcp客户端,客户端和效劳端创设联结后,效劳端一向sleep,而后客户端一向发送数据会是甚么局势”。
回复这个题目前咱们先想一想tcp的特点和tcp发送数据的大要经过:首先,tcp是有链接的牢靠传输协定,所谓牢靠也便是说保证客户端发送的数据效劳端都能够收到,而且是按次收到。那末对于上头的题目就弗成能存在数据的丢弃。那末客户端一向发送数据越来越多何如办?上面咱们剖析一下tcp的传输经过。
图1
如图1所示当发送数据时:
(1)数据首先由运用程序缓冲区复制到发送端的套接字发送缓冲区(位于内核),注意这个经过是用相仿write机能的函数实现的。有的人常常看到write胜利就认为数据发送到了对端主机,原本这是差错的,write胜利只是示意数据胜利的由运用过程缓冲区复制到了套接字发送缓冲区。
(2)而后内核协定栈将套接字发送缓冲区中的数据发送到对端主机,注意这个经过不受运用程序操纵,而是发送端内核协定栈实现,个中包罗应用滑动窗口、用赛操纵等机能。
(3)数据来到接管端主机的套接字接管缓冲区,注意这个接管经过也不受运用程序操纵,而是由接管端内核协定栈实现,个中包罗发送ack确认等。
(4)数据由套接字接管缓冲区复制到接管端运用程序缓冲区,注意这个经过是由相仿read等函数来实现。
1.1障碍方法的境况了解了这个经过,咱们在看一下在默许境况下(套接字为障碍方法)write等函数的劳动方法:输出职掌,包罗write、writev、send、sendto和sendmsg共5个函数。对于一个TCP套接字,内核从运用过程的缓冲区到套接字的发送缓冲区复制数据。对于障碍的套接字,假若其发送缓冲区中没有空间,过程将被投安眠眠,直到有空间为止。——UNPv1
云云咱们就能够揣摩出实现果:障碍方法下,假若效劳端一向sleep不接管数据,而客户端一向write,也便是只可施行上述经过中的前三步,云云最后后果必定是接管端的套接字接管缓冲区和发送端套接字发送缓冲区都被填满,云云write就没法延续将数据从运用程序复制到发送端的套接字发送缓冲区了,进而使过程进安眠眠。
考证例子以下,客户端代码:
客户端屡屡write胜利一次,将计数器count加1,同时输出本次write胜利的字节数。count保管客户端write胜利的次数。
效劳端代码:
首先编译运转效劳端,而后启动客户端,运转后果如图2所示。
图2
能够看到客户端write胜利次后就堕入了障碍,注意这个时间不能阐明发送端的套接字发送缓冲区一点是满的,只可阐明套接字发送缓冲区的可用空间小于write恳求写的本身数——。
增加:当效劳端sleep到后,会关上现时联结,此时客户端处于障碍中的write会返回差错,成效如图3。
图3
1.2非障碍方法的境况上面看一下非障碍套接字境况下,write的劳动方法:对于一个非障碍的TCP套接字,假若发送缓冲区中根蒂没有空间,输出函数将急忙返回一个EWOULDBLOCK差错。假若发送缓冲区中有一些空间,返回值将是内核能够复制到该缓冲区的字节数。这个字节数也成为“不够计数”。——UNPv1
云云就能够了解非障碍境况下效劳端一向sleep,客户端一向write数据的成效了:最先客户端write胜利,跟着客户端write,接管端的套接字接管缓冲区和发送端的套接字发送缓冲区会被填满。当发送端的套接字发送缓冲区的可用空间小于write恳求写的字节数时,write急忙返回-1,并将errno置为EWOULDBLOCK。
考证例子代码以下。
l效劳端同障碍境况(略)。
客户端(非障碍形式):
首先编译运转效劳端,而后启动客户端,运转后果以下图4所示。
图4
能够看到客户端胜利write次后就产生套接字发送缓冲区空间不够,进而返回EWOULDBLOCK差错。咱们注意到屡屡write相同的字节数()障碍形式下能write胜利次,为甚么非障碍境况下要少呢?
这是由于障碍形式下一向write到接管端的套接字接管缓冲区和发送端的套接字发送缓冲区都满的境况才会障碍。而非障碍形式境况下有大概是发送端发送经过的第二步较慢,形成发送端的套接字发送缓冲区很快写满。而接管端的套接字接管缓冲区还没有满,云云write就会只是由于发送端的套接字发送缓冲区满而返回差错(明确的说的套接字发送缓冲区的可用空间小于write恳求写的字节数)。
对照一下凑巧是的二倍左右,以是能够揣摩由于发送经过第二步的推迟,很大概发送端的套接字发送缓冲区曾经满了,而接管端的套接字接管缓冲区依旧空的。
1.3UDP境况增加对于UDP套接字不存在真实的发送缓冲区。内核不过复制运用过程数据并把它沿协定栈向下传递,渐次冠以UDP首部和IP首部。于是对于一个障碍的UDP套接字(默许配置),输出函数移用将不会由于与TCP套接字相同的原于是障碍,不过有大概会由于其余原于是障碍。——UNPv1
举荐赏玩:
齐全整顿
篇高质手艺文章目录整顿
从TCP协定的道理来谈谈rst复位进攻
甚么是数据库的脏读、弗成反复读和幻读
高机能网络编程之accept创设联结
Linux过程及其调整战术
专一效劳器靠山手艺栈学识归纳分享
迎接