c#和python同一主机直接udp_TCP/UDP,是什么,哪里不一样?

2903bb0bdb1aac20e509e3cffe7bc96d.png

在讲TCP/UDP之前,我们先来看一下网络传输协议的五层模型:

在网络传输过程中,不同的层次都要遵循一定的协议,也就是都同意的一个约定,只有在一个层面下都使用同一份协议,那传输才会有可能。不然,你随便发一堆乱码过去,没人会知道你想表达的是什么意思。

这里我们介绍的是五层结构框架,与之对应的还有七层网络框架以及四层框架,由于本人暂时还没有接触到,这次就先不对其余的两个框架进行分析了。五层框架主要分为这样五层:物理层、连接层、网络层、传输层、应用层。

物理层(physical layer)

所谓的物理层,是指光纤、电缆等真实存在的物理媒介。这些媒介可以用来传送信号,比如亮度、电压或者振幅,不过我们平时用的最多的,还是电压信号,那我们就可以规定,高电压表示1,低电压表示0,这样,一段电流中就可以承载我们的信息,也就形成了简单的物理层协议。

64a2aa1c9dfc0e7303a775da66ff81dd.png

连接层(link layer)

在连接层,信息以帧(frame)为单位传输。所谓的帧,是一段有限的0/1序列。连接层协议的功能就是识别0/1序列中所包含的帧。在帧中,有我要传输去的目标地址(Source, SRC),还有送出消息的送信地址(Destination, DST),以及能够探测错误的校验序列(Frame Check Sequence)。除此之外,还有最重要的--->我们的数据!但是,连接层协议不关心数据中到底包含什么。它更像是一个包裹,你有啥,我就传啥,是不是违禁物品?那不是我要关心的。

以太网(Ethernet)和WiFi是现在最常见的连接层协议。通过连接层协议,我们可以建立局域的以太网或者WiFi局域网,并让位于同一局域网络中的两台计算机通信。

上周我们实现的TCP传输,就是基于连接层协议实现的一个信息交流。详见链接:利用TCP协议实现手机与电脑的通信

网络层(network layer)

那现在是可以实现一个局域网下的通信了,那我如果想要实现局域网之外的通信呢?那就用到了我们的网络层协议,比如说我们的路由器,就担任了这样一个角色。它可以介入多个网络,并且可以理解接入网络的连接层协议。那通过路由器,一个更广范围的交流区域就可以实现了。

48c08199412a7ad007c76716cf3fe5a5.png

传输层(transport layer)

这里就会说到我们的主角——TCP/UDP,不过,为了更好的结构,我们待会儿再让他登场。

应用层(application layer)

应用层协议是对传输内容进一步的用语规范。应用层的协议包括用于Web浏览的HTTP协议,用于传输文件的FTP协议,用于Email的IMAP等等。

下面正式步入正题:

TCP (Transmission Control Protocol) 和UDP (User Datagram Protocol) 协议,就是属于传输层协议。其中TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接的、端到端的和可靠的数据包发送。通俗说,它是先连接,后发送数据的;而UDP则不为IP提供可靠性、流控或差错恢复功能,也就是只管发,具体你收不都得到,那我就不管了。一般来说,TCP对应的是可靠性要求高的应用,而UDP对应的则是可靠性要求低,更加在乎传输速度的应用。

TCP建立连接要进行3次握手:

4a152c4bd3ee0e2e1a03da76aa7e7aa5.gif

1)客户端--->主机:“我要发数据了,你准备好了嘛?”

这个过程中,客户端通过向主机发送一个含有同步序列号(SYN=1)的标志位的数据段给主机,向主机请求建立连接,通过这个数据段,客户端告诉主机两件事:我想要和你通信;你可以用哪个序列号作为起始数据段来回应我。

2)主机--->客户端:“行,我准备好了,你要什么时候发过来?”

主机收到客户端连接的请求后,用一个带有确认应答(ACK=1)和同步序列号(SYN=1)标志位的数据段响应客户端,也告诉客户端两件事:我已经收到你的请求了,你可以传输数据了;你要用序列号作为起始数据段来回应我。

3)客户端--->主机:“OK,这就是,你收着吧!”

客户端收到主机返回的数据段后,再次发送一个确认的应答,确认报文ACK=1,准备开始传输数据。

在连接的整个过程中,如果没有收到成功的连接请求,服务器端将会保持一个阻塞状态,也就是说,我就是来接收的,你不来,那我就一直等着你~

等到三次握手完成,就能够建立起比较稳固的连接(注意:是对比于UDP的稳固),这个过程中,不会涉及到应用层的数据,SYN这个标志位只有在TCP建立起连接后才会被置1,握手动作完成后,SYN重新标志位被置为0。

TCP联机的解除,需要4次挥手:

133c34b0afcbe832a1d5010cc0180b59.gif

1)客户端--->服务器:“好了,数据发完了,你收到了吗?”

客户端发出连接释放报文,并停止发送数据,释放报文首部,FIN = 1,序列号seq=u(等于前面发送的数据的最后一个字节的序号加1),发送完后,客户端等待服务器的应答。这个报文即使不携带信息,也要消耗一个序号。

2)服务器--->客户端:“嗯好,我收到了。”

服务器收到连接释放报文,发出确认报文,ACK=1,确认序号为u+1,seq=v,而后进入等待着状态。此时,客户端向服务器端的发送就已经被关闭了,但是从服务器向客户端的发送还是可以实现的。

3)客户端--->服务器:“好,那这次对话就到这儿吧!”

客户端收到服务器的确认后,进入终止等待状态,等待服务器发送最后的释放报文,如果还有数据,则继续接收。

4)服务器--->客户端:“好”

服务器发送最后的释放报文,连接中断。至此,一次完整的TCP连接完成。

至于使用UDP协议时,就没有这么麻烦,只要我知道你的地址,我就直接发送。就有点类似与我们发短信的过程。当你拿到目标人物的手机号后,你就会认为你可以通过短信联系上,那就直接发短信嘛,那结果呢?很有可能手机号是错误的,那最终就极有可能导致你要传递的信息丢失。但是由于UDP的连接简单(如果这个也算连接的话),他的速度,是TCP所远远不及的。

当我们在局域网下进行数据交换时,UDP的高速和简便,还是有很多用武之地的。

后面我将使用UDP尝试完成手机端与电脑端的远程控制。感兴趣就请关注我吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值