仙剑3: 带你看胡霍CP,聊TCP/UDP/Socket
仙剑3: 带你看胡霍CP,聊TCP/UDP
相信很多人都看过仙剑3这部电视,大火之后,产生了胡霍CP,产生了一个娱乐圈现象,是胡不是霍,是霍躲不过Ya ~在要好的朋友也是有区别的,有什么甚至是互补的一对,TCP和UDP也是如此。
TCP/UDP 区别
所有的信息通信都是要有连接的。所谓的建立连接,是为了在客户端和服务端维护连接,而建立一定的数据结构来维护双方交互的状态,用这样的数据结构来保证所谓的面向连接的特性。
-
TCP 连接传输的数据,无差错、不丢失、不重复、并且按序到达。而UDP 继承了 IP 包的特性,不保证不丢失,不保证按顺序到达。
-
TCP 是面向字节流的,之所以变成了流,这也是 TCP 自己的状态维护做的事情。而UDP 继承了 IP 的特性,基于数据报的,一个一个地发,一个一个地收。
-
TCP 是可以有拥塞控制的,UDP不会。
-
因而TCP 其实是一个有状态服务,而UDP是没有的,潇洒的。
MAC 层定义了本地局域网的传输行为,IP 层定义了整个网络端到端的传输行为。
网络传输是以包为单位的,二层叫帧,网络层叫包,传输层叫段。我们笼统地称为包。包单独传输,自行选路,在不同的设备封装解封装,不保证到达。
UDP
UDP的使用场景
胡饰演的景天就具有简单、灵活、做事喜欢自由自在,他的特点和UDP很相似,下面就说说UDP应用到那些地方?
1、需要资源少,在网络情况比较好的内网,或者对于丢包不敏感的应用。
2、不需要一对一沟通,建立连接,而是可以广播的应用。
3、需要处理速度快,时延低,可以容忍少数丢包,但是要求即便网络拥塞,也毫不退缩,一往无前的时候。
记得上初中的时候特别喜欢看风云,里面有个人物叫无名剑神,他那招万剑归宗,就是金光闪闪、各种刺出,和UDP的发包差不多,也不管敌人受不受伤害,就是一顿Q,UDP不管对方有没有响应,也在无限发,管它洪水滔天。
TCP
TCP特点
我国自古以来以礼仪之邦,长幼有序,所以TCP的传输是有序的,一个跟着一个的传输,编号是为了解决乱序问题。还应该有的就是确认序号。如果没有收到就应该重新发送,直到送达。这个可以解决不丢包的问题。
成年以后,我们发现要尽量做一个靠谱的人。而作为 IP 的上一层 TCP 也无是这样,唯一能做的就是更加
努力,不断重传,通过各种算法保证。在自己的层面,尽量做到不丢包。
除了做流量控制以外,TCP 还会做拥塞控制,对于真正的通路堵车不堵车,它无能为力,唯一能做的就是控制自己,也即控制发送的速度。
三次握手
我有一个叫绘绘的朋友,家住马泉营,偶尔周末约起来,共渡周末时光。早晨8点我从龙泽出发,相约在他家打游戏,到下午4点的时候我俩一块回龙泽吃顿小龙虾,天黑了,因为他不是妹子,所以他需要自己回到马泉营,TCP的三次握手简单来讲就是信息的数据,各回各家,到家以后给对方一个确认的消息。然后建立连接的双方,进行通信。
四次挥手
有一次和小姐姐约好了出去浪,但小姐姐临时有事定不下来,她说我三点告诉你能不能赴约,我答知道了,到3点半的时候我看她没有应答,就主动问了她你那边ok么,她回答说,来不及了,我们下次再约。
TCP的断开连接也是一个原理,A端主动断开,B会给以回应,随后B端还会确认一次信息,A端有两种情况,一种是积极确认信息,第二种是不管发来的信息,TIME_WAIT 超时结束…或者是端口已经连接到新的应用了。
Socket
网络之前之所以可以通信,客户端最基本的条件是有目标IP和端口号进行请求,服务端监听端口,对该地址的访问端口的应用进行通信,比如下面的nginx服务在监听8080端口。
# nginx监听的8080端口server{listen 8080;...}
socket就好比是一个手持皇帝金牌的钦差,直接向皇帝负责,简化了中间的巡抚、总督、军机处层层汇报的过程,更像是一个专用的管道,直接传过传输层。
Socket使用
1、UDP
server.php
//error_reporting( E_ALL );set_time_limit( 0 );ob_implicit_flush();$socket = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );if ( $socket === false ) {echo "socket_create() failed:reason:" . socket_strerror( socket_last_error() ) . "\n";}$ok = socket_bind( $socket, '202.85.218.133', 11109 );if ( $ok === false ) {echo "socket_bind() failed:reason:" . socket_strerror( socket_last_error( $socket ) );}while ( true ) {$from = "";$port = 0;socket_recvfrom( $socket, $buf,1024, 0, $from, $port );echo $buf;usleep( 1000 );}?>
client.php
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);$msg = 'hello';$len = strlen($msg);socket_sendto($sock, $msg, $len, 0, '202.85.218.133', 11109);socket_close($sock);?>
2、TCP
server.php
//error_reporting( E_ALL );set_time_limit( 0 );ob_implicit_flush();$socket = socket_create( AF_INET, SOCK_STREAM, SOL_TCP );socket_bind( $socket, '192.168.2.143', 11109 );socket_listen($socket);$acpt=socket_accept($socket);echo "Acpt!\n";while ( $acpt ) {$words=fgets(STDIN);socket_write($acpt,$words);$hear=socket_read($acpt,1024);echo $hear;if("bye\r\n"==$hear){socket_shutdown($acpt);break;}usleep( 1000 );}socket_close($socket);?>
client.php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);$con=socket_connect($socket,'192.168.2.143',11109);if(!$con){socket_close($socket);exit;}echo "Link\n";while($con){$hear=socket_read($socket,1024);echo $hear;$words=fgets(STDIN);socket_write($socket,$words);if($words=="bye\r\n"){break;}}socket_shutdown($socket);socket_close($sock);?>
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
