什么是tcp/udp协议?

tcp/udp协议是一协议(http、smtp、DNS、ftp)的基础,意思是这些协议的底层是通过tcp/udp协议实现的,tcp/udp协议主要用于应用程序之间的通信规则,而我们前面学过的ip则是用于找到目的电脑,而tcp/udp则是在目的电脑上找到和你通信的软件,因为一台电脑上会有多个软件,每个软件都会监听一个端口,这个端口是0-65535这间的数据,这个数据标识了相应的应用程序。

如上图所示,老大的电脑上安装了qq和钉钉两款软件,老二的电脑也安装了这两款软件,现在老大要用qq和老二进行通信,那么首先通过会通过ip 192.168.2.122找到老二的电脑,此时老二的电脑上有两款软件,qq监听在5000端口(5000端口标识qq软件),钉钉监听在5601端口(5601号端口标识钉钉软件),由于qq软件在编写时,就固定在5000端口,所以消息到达老二的电脑后,会直接发给5000端口的软件,在这里就是qq,而不是5601号端口的软件(钉钉),此时,老二的qq软件就会收到老大qq软件发送的消息,钉钉也是一样的原理,正是有了端口的概念,所以软件之间才不会发错消息,那怕你的电脑上有1000款软件,也不会弄错,因为只要对方知道你每个软件的端口就行了。

注释:ip是个于你在那个小区,而tcp/ip就相当于你的门牌号,一个小区里面有很多住户,每个住户都有一个门牌号。ip和tcp/udp结合起来就可以精准找到某个住户,找到住户(软件)以后,你和这个住户之间的通信规则(协议),由软件自己设定,软件之间常用的通信协议如下:

21:FTP服务所开放的端口,用于上传、下载文件。
22:SSH端口,用于通过命令行模式远程连接Linux服务器或vps。
23:Telnet端口,用于Telnet远程登录服务器。
25:SMTP服务所开放的端口,用于发送邮件。
80:HTTP用于HTTP服务提供访问功能,例如,IIS、Apache、Nginx 等服务。
143:IMAP用于IMAP(Internet Message Access Protocol)协议,IMAP 是用于电子邮件的接收的协议。
443:HTTPS 用于HTTPS服务提供访问功能。HTTPS 是一种能提供加密和通过安全端口传输的一种协议。
3389:远程桌面服务端口,可以通过这个端口远程连接服务器。
8080:代理端口,同80端口一样,8080 端口常用于WWW代理服务,实现网页浏览。

如果使用上面协议的默认端口,我们可以很容易的知道目前正在使用的是什么程序,并且知道它占用了哪个端口。当然,在特定情况下,我们也可以对默认端口进行调整,例如,将HTTP请求端口修改为8080或8888也是我们非常常用的修改,但这样一来,知名端口就变成非知名了,同时,若我们不知道该应用的端口,也就不知道对方提供的是什么服务了。

案例演示

现在,我们拥有了「本地IP地址」、「本地应用端口」、「远程IP地址」、「远程应用端口」、「协议」这五条信息,通常我们会把它们看做一个整体,称之为「五元组」,五元组中的信息都是独一无二的。

我们这里使用Windows来做一下演示(Linux、MacOS操作系统原理相同),打开Windows的任务管理器,查看详细信息列表,以谷歌浏览器为例,我们会发现有好多谷歌浏览器的进程,且他们后面的「PID」也不尽相同,就是这些进程,组成了一个应用程序。

有些应用程序只有一个进程,而有些应用程序则会有多个进程,其中一些进程是用来访问网络的,这意味着它们将被分配TCP或UDP端口。

我们也可以使用「netstat」命令,并配合「-ano」选项,在DOS系统中显示所有连接信息,可以同时看到进程的详细信息,例如,通过查看左侧的协议,我们就可以知道,每一项进程采用了TCP还是UDP,他们的本地IP地址、本地端口号、远程IP地址、远程端口号、链接状态以及最右侧的PID进程号。

netstat

TCP与UDP的区别

到这里,大家可以发现,我们的内容都是围绕TCP和UDP展开的,虽然它们有很多通用的地方,但通过标头信息我们可以确定,TCP和UDP是两个完全不同的概念。

1、轻量与非轻量

UDP是轻量级的,通常都会被分配一些较轻量的任务;而TCP因其完整的内容体系,通常都会涉及许多额外的功能。

2、连接与无连接

2.1、TCP面向连接

例如TCP是面向连接的,而UDP是面向无连接的。面向连接的意思就是,TCP将在一对主机上建立并跟踪双方应用程序之间的会话连接,在准备好数据之后进行发送,之后关闭连接;但TCP的任务还没结束,相反它会启动更多的功能,例如:错误恢复、流量控制等。

2.2、UDP无连接

然而UDP则不会尝试建立连接,它只会开始准备自己的数据,而不去担心那些细节,UDP对于错误的处理方式也和TCP完全不同!对于UDP来说,数据包或数据段丢失与否,它并不关心,相反,会继续传输下一个数据。

TCP则不同了,它非常在意每一次数据传输的完整性,准确性,一旦发生丢失,它便会将丢失的部分重新传递!

3、窗口化

也正因为如此,TCP被认为是可靠的伙伴,UDP则通常被认为是不可靠的,因为TCP的这一特性,催生出了「窗口化」这个TCP的功能,窗口化的概念就是,”一台设备向另一台设备传递了某段消息,接收方必须对这段消息做出相应,若发送方没有收到响应,则会尝试重新发送该段内容“。

3.1、窗口大小

因此,对于一次可以发送多少数据,接收方必须确认这一点,该值称为「窗口大小」,如果没有丢失数据,则窗口大小可以「动态增长」;如果有数据丢失,则窗口大小可以「动态缩小」

3.2、数据切片与排序

由于较大的数据信息会被切片,对于数据段的顺序问题,TCP会使用标头中的序列号来追踪数据段的顺序信息,这对于某些应用程序可能很关键,例如:QQ中的文件分享,若中断了,下次连接需要接着上次的进行传递,也称为「断点续传」。

而对于一些应用程序,这并不重要,这也是为什么我们要使用UDP的原因,那UDP到底有什么作用呢?它看起来功能很少,而且似乎缺乏某些关键的功能,忽视顺序,忽视错误,确定能作为传输协议?

4、UDP终极奥义

话不多说,直接上案例,大家可以想象一下我们在使用语音或视频通话这类实时交互的应用,例如:微信语音,微信视频,QQ语音,QQ视频等等,若由于网络原因,导致语音、或视频卡顿,必定会造成音频流或视频流数据的丢失。

udp

对于TCP来说,由于其严谨的态度,每次丢失的数据都要重新整理发送,这样一来,我们可能永远在和一个有延时的人进行语音或视频通话,这反而影响我们的使用体验。

相反,如果我们抱有这样一种态度,这些包丢了就丢了吧,一会网络好了再重新说一遍就好了……大家心里应该清楚了,对于语音与视频这种通讯方式通常都会使用UDP协议,它可以有效的避免一些问题的发生。

tcp

现在,我们知道了,TCP和UDP各有所长,TCP更完整,更严谨,而UDP更轻便,对于实时通话支持友好!因此,在合适的位置使用合适的协议显得尤为重要!

总结

  • ip协议用于找到对方的电脑
  • tcp/udp用于找到对方电脑上的软件
  • 其他协议比如http、smtp、ftp都是软件之间的通信协议规则,你甚至可以自己写款软件,自己设定一个协议叫zhangsan,用于你自己这款软件的通信
  • tcp主要的传输是比较可靠,所以主要用于文件传输、电子邮件等。而udp的传输是不可靠的,可能会丢失数据,所以主要面向实时应用、流媒体应用、游戏等对延迟敏感或对无序性可容忍的应用场景,这些场景可以容忍数据的丢失。

问题

1、如何使用netstat命令查看qq所占用的端口和使用协议?
2、请在网络上搜索常用协议http、https、ftp、smtp、telnet、ssh是做什么的,我们平时如何使用他?

原创文章,转载请注明出处:http://b.nwumba.cn/article/93/