这是张富涛的第5篇原创
网络编程:TCP与UDP简介及端口映射技术
1. TCP与UDP简介
在Java中,网络编程有两种通讯协议:TCP 和 UDP。
其中两种传输方式的优缺点对比:
-
TCP:优点较为安全,缺点是较慢。
-
UDP:优点较快,缺点是“丢包”。
传输方式的差别:
-
TCP:A链接B,只要链接上就不用再次建立链接,下次可以直接传输(类似打电话)
-
UDP:数据发送过去,不关心消息送没送到,不关心传输地址存不存在,消息发送了之后,链接就断开了(类似发快递、给离线的用户发送qq)
2. 什么是端口
每个应用程序都有权利去接收和发送一些网络数据,而一个计算机上可能运行着上千个应用程序,所以计算机发明了一个计算机上的地址——端口。端口用来区分接发信息的网络应用程序的唯一性的东西。
端口最多有65535个,但是1~4000端口是“系统保留端口”,“系统保留端口”的意思是系统霸占了的端口,我们尽量不要用4000以下的端口,因为系统不确定什么时候会用,但是这也说明:系统要是用端口,就不会用4000以上的端口。 所以4000以上的端口都是用户注册的端口。
TCP和UDP同时可以占用一个端口,但是尽量不要用同一个端口。
3. 端口映射
比如A和B两个电脑通过路由器连接网络,他们共同分享的ip是路由器中公网的ip,同时他们自己也有一个ip,是内网的ip,外界是无法直接找到连接到路由器中的电脑的,原因就是在于内网的ip是虚拟的,多个计算机链接路由器上网,他们没有属于公网中的ip,他们共用的是路由器的ip,而路由器也不知道这条请求到底是访问到哪个计算机的哪个端口,所以出现了端口映射这个概念:
如下图,路由器通过ASDL拨号上网获得到的公网ip为:61.1.1.1,电脑A和B通过路由器上网,他们共享“61.1.1.1”的网络,并且或得到了两个内网的ip:“168.160.1.1”和“168.160.1.2”。
外界无法直接找到电脑A或者电脑B,如果外界发送一条请求,找到的ip只能为“61.1.1.1”,可是这个路由器也分不清究竟这条请求时找的电脑A还是电脑B,此时我们就要用“端口映射”这个技术来解决这个问题了。
我们可以手动操作:将“电脑A”的要接收这条请求的应用端口,映射到路由器中的一个端口,比如“电脑A”的4001端口需要接收这条请求,我们将路由器的4002端口,对应到“电脑A”的4001端口,请求发送到“61.1.1.1:4002”,就会转发到电脑A的内网:“168.160.1.1:4001”上。
这就是端口映射技术。
那为什么我们平时在家链接路由器,QQ等软件不需要我们手动的去将端口映射到路由器上呢?这是因为我们平时用QQ等软件、IE浏览器还有玩游戏等路由器都自动配置了映射关系,所以并不需要我们去手动配置,而如果我们在内网中搭建一个服务器,外网想要访问的时候,我们就需要手动去进行映射了。
最近我在为我们的“万方数据知识服务新平台”增加微信支付功能,如果微信支付成功,微信需要向我的服务器发送一条支付成功的notify通知,可是在项目正式上线之前,微信是通知不到我本地计算机的。因为我们一个办公室的网络链接的是同一个路由器,说明我们共用一个网络,不论我直接填写了“内网的ip地址”还是“路由器的公网ip”,微信都找不到我,这时我们有两个解决方案:一种是利用端口映射技术,将我们“内网ip”及“tomcat端口”都映射到路由器上,另外一盅是借另外一台直接连接到公网的计算机搭建项目进行调试。
但是无论如何,将“内网的ip地址”或“路由器的公网ip”告诉微信让其进行通知这种做法都是不对的,小伙伴们在开发的时候一定要注意哦!
---------------
公众号:张富涛的学习笔记(ID:futaoNT)
知乎:张富涛
CSDN:张富涛
B站:你给的宝物
这是一个在夜晚可以靠编程拯救世界的程序员,关注他将在第一时间获悉他的知识、工作心得!
长按下图二维码关注: