Internet 是不可靠的。当网络拥塞时,来不及处理的数据包就被路由器直接丢弃。应用程序通信发送的报文需要完整地发送到对方,这就要求在通信的计算机之间有可靠传输机制。 Internet中的计算机有不同的操作系统,如Windows操作系统、Linux操作系统和UNIX操作系统等,智能手机也要访问Internet,智能手机有安卓系统和苹果系统,这些系统能够相互通信、实现可靠传输,是因为这些系统使用了相同的可靠传输协议-TCP(Transmission Control Protocol,传输控制协议),TCP是Internet的标准协议。有些应用程序通信使用TCP不合适,就使用(User Datagram Protocol,UDP)用户数据报协议。
TCP和UDP工作在相互通信的计算机上,为应用层协议提供服务,这两个协议被称为“传输层协议”。
传输层的两个协议-TCP和UDP有各自的应用场景。
TCP为应用层协议提供可靠传输,发送端按顺序发送,接收端按顺序接受,其间如果发生丢包,乱序由TCP负责重传和排序。
下面是TCP的应用场景:
(1)客户端程序和服务器端程序需要多次交互才能实现应用程序的功能。例如,接收电子邮件使用的是POP3,发送电子邮件使用的是SMTP,传输文件使用的是FTP,在传输层使用的是TCP。
(2)应用程序传输的文件需要分段传输,例如,使用浏览器访问网页,网页中的图片和HTML文件需要分段后发送给浏览器;又比如使用QQ传输文件,在传输层也是选用TCP。
如果需要将发送的内容分成多个数据包发送,这就要求在传输层使用TCP在发送方和接收方建立连接,实现可靠传输、流量控制和和避免拥塞。
例如,从网络中下载一个500MB的电影或下载一个200MB的软件,这么大的文拆分成多个数据包发送,发送过程需要持续几分钟或几十分钟。在此期间,发送方将要发送的内容一边发送一边放到缓存中,将缓存中的内容分成多个数据包,并进行编号,按顺序发送。这就需要在发送方和接收方建立连接,协商通信过程的一些参数(如一个数据多少字节等)。如果网络不稳定造成某个数据包丢失,发送方必须重新发送丢失的数据包,否则就会造成接收到的文件不完整,这就需要TCP能够实现可靠传输。如果发送方发快,接收方来不及处理,接收方还会通知发送方降低发送速度,甚至停止发送。TCP还能实现流量控制,因为Internet中的流量不固定,流量过高时会造成网络拥塞(这一点很就像城市上下班高峰时的交通堵塞一样),在整个传输过程中,发送方要一直探测网塞来调整发送速度。TCP还有拥塞避免机制。
发送方的的发送速度由网络是否拥塞和接收方接受速度两个因素控制,哪个速度低就用那个速度发送。
有些应用程序使用TCP就显得效率低了。例如,有些应用的客户端只需要向服务器端发送一个请求报文,服务器端返回一个响应报文就可以完成其功能。这类应用如果使用TCP发送3个数据包建立连接,再发送4个数据包释放连接,只为了发送一个报文,就很不值得,这时干脆让应用程序直接发送。如果丢包了,应用程序再发送一遍即可。这类应用,在传输层就使用UDP。
下面是UDP的应用场景:
(1)客户端程序和服务器端程序通信,应用程序发送的数据包不需要分段。如域名解析,DNS协议使用的就是传输层的UDP,客户端像DNS服务器发送一个报文请求解析某个网站的域名,DNS服务器将解析的结果通过一个报文返回给客户端。
(2)实时通信。这类如QQ或微信语音聊天,或视频聊天的应用,发送方和接收方需要实时交互,也就是不允许较长延迟,即便有几句话因为网络堵塞没听清楚,也不允许使用TCP等待丢失的报文,等待的时间太长了,就不能许快的聊天了。
(3)多播或广播通信。如学校多媒体机房,老师的计算机屏幕需要分享给教室里的学生计算机,在老师的计算机上安装多媒体教室服务端软件,在学生的计算机上安装多媒体教室客户端软件,老师的计算机使用多播地址或广播地址发送报文,学生的计算机都能收到。
这类应用在传输层使用UDP。
可见根据通信的特点,一个应用程序通信可以在传输层选择不同的协议。
应用层协议很多,但传输层就两个协议,如何使用传输层的两个协议标识应用层协议呢?
通常使用传输层协议加一个端口号来标识一个应用层协议。如下,
(1)HTTP默认使用TCP的80端口。
(2)FTP默认使用TCP的21端口。
(3)SMTP默认使用TCP的25端口。
(4)POP3默认是用TCP的110端口。
(5)HTTPS默认使用TCP的443端口。
(6)DNS默认使用UDP的53端口(其实TCP的53端口它也占着)。
(7)远程桌面协议(RDP)默认使用TCP的3389端口。
(8)Telnet默认使用TCP的23端口。
以上列出的都是默认端口,当然可以更改应用层协议使用的端口。如果不使用默认端口,客户端需要指明所使用的端口。
1.服务器使用的端口
服务器使用的端口号又分为两类,最重要一类叫做“熟知端口号”或“系统端口号”,数值为0~1023.这些数值可在网址IANA官网查到。互联网数字分配机构(IANA)把这些端口号指派给了TCP/IP最重要一些应用程序,让所有的用户都知道。另一类叫做“登记端口号”,数值为1024~49151.这类端口号是供没有熟知端口号的应用程序使用的。使用这类端口号必须在IANA按照规定的手续登记,以防止重复。例如微软的RDP使用TCP的3389端口,就属于登记端口号的范围。
2.客户端使用的端口号
当打开浏览器访问网站或登录QQ等客户端软件和服务器建立连接时,计算机会为客户端软件分配一个临时端口,这就是客户端端口,取值范围为49152~65535。由于这类端口号仅在客户进程运行时才动态选择,因此又叫作“临时(短暂)端口号”。这类端口号是留给客户进程暂时使用的。当服务器进程收到客户进程的报文时,就知道了客户进程所使用的端口号,因而可以把数据发送给客户进程。通信结束后,刚才已使用过的客户端口号就不复存在,这个端口号就可以供其他客户端进程以后使用。