传输层介于网络层和应用层,能够实现计算机通信中的可靠传输。
在计算机通信中,应用层协议定义了客户端能够向服务器发起什么样的请求,以及服务器向客户端作出什么样的响应和操作(通过不同请求的数据包格式表达)。那么客户端向服务器发送的请求,就需要传输层来负责可靠传输。
TCP协议:当数据包传输过程中丢包,则重传数据包;感知网络状态知道网络堵塞,则会降低传输数据包的速率;根据客户端接受能力调整发送速度,如果接收端缓存满了,则会降低传速率;通信前,接收双方建立连接,通信后接收双方会释放连接,通信过程中要进行流量控制来保证可靠传输。
UDP协议:没有流量控制和差错检验功能的TCP协议。
TCP协议:需要传输的数据包比较大,需要分成几个小的数据段传输,而且需要给数据段编号保证接收端收到后可以正确拼装起数据包。数据传输过程中要求可靠传输,出现丢包时会通知发送端重传数据,且当链路状态不佳时会自动调整传输速率以保证传输稳定。在数据传输之前会建立TCP连接,进行参数协商(选择性确认、最大报文等),通信结束后释放连接。
例子:访问web网页
UDP协议:缺少了很多TCP协议的功能。其特点主要是节省开销。传输成功与否由应用层判断而不是传输层。
例子:
1.在地址栏输入www.baidu.com,这是域名,计算机访问需要将域名转为IP地址。此时需要DNS来解析域名,这个操作本身就是发送一个DNS数据包到网络中的DNS服务器中获取目标的IP地址。这一个请求一个数据包就可以完成,不需要分段;且如果传输失败,发送端会在等待后再次尝试发送,几次失败后就会报错,不保证可靠传输。
2.QQ消息,发送的QQ消息数据量小,用UDP协议传输。如果传输失败,QQ客户端会出现红色感叹号表示因为某些原因传输失败了,此时用户决定时候重传该消息。传输结果由应用层判断。
3.特殊性质下的UDP协议:QQ实时语音。语音通话时,通话时间长短不定,必然是一个数据包无法承载所有数据量,且要求数据包必须严格按顺序到达。这种情况下仍然使用UDP协议。因为可靠传输没有有意义,假如声音数据包按照编号1234发送,其中23丢包,然后重传23,接收端会收到14后再接收23,接收端听到的内容是1423,对于实时语音来说是语无伦次的。也就说如果实时语音因为网络原因丢包,则接收端接收不到对应的数据包,但是仍然会接收接下来的数据包,就会出现网络不好会听不到对面说什么,通话断断续续。
传输层协议和应用层协议之间的关系
应用层协议有很多,HTTP,FTP,SMTP,POP3,DNS等,而传输层只有两个协议,UDP和TCP。那么如何使用这两个协议来区分上面的诸多协议呢?——使用传输层协议加上一个端口来区分。
下面是常见的传输层协议和端口。
这是默认端口,可以更改。
HTTP=TCP+80
HTTPS=TCP+443
FTP=TCP+21
SMTP=TCP+25
POP3=TCP+110
RDP=TCP+3389
DNS=UDP+53 (偶尔TCP+53)
MSSQL=TCP+1433
MySQL=TCP+3306
Win共享=TCP+445
telnet=TCP+23
服务和端口
服务器中运行的服务会开启对应的端口来侦听客户端的请求。客户端访问服务器,数据包过来会在传输层首部 写上目标端口、源端口以及协议类型,服务器收到数据包后会转发到对应的端口来完成接下来的操作。
防火墙:设立防火墙后,可以开启或关闭某些端口,从而保证网络的安全性。即便服务器所有的端口处于侦听(开启状态),数据包也无法到达。因为防火墙阻止了数据包进入。
上图中,只开启FTP的端口,则只有FTP的数据包能够访问服务器,其他数据包将被阻止访问服务器。
防火墙如果关闭TCP和UDP协议,就相当于屏蔽了所有进入服务器的数据包,即便服务器bug满天飞,全是漏洞,也能保证网络安全(物理手段入侵当然无法避免)。因为黑客无法访问到你的服务器漏洞,自然无法入侵。
也就说防火墙设立时,应该只开放有必要的端口而关闭不用的端口,来保证网络安全。
端口侦听
Win系统上的服务,无非两种。一种是为本系统提供的服务,另一种是为网络中其他系统提供的服务。后者需要使用TCP和UDP的某个端口侦听客户端请求,前者不与其他系统通讯,则不用使用端口。
先来看本系统的服务
这些服务一旦停止,会对本系统造成直接的影响,比如停掉逻辑磁盘服务会导致你无法再管理磁盘,停掉网络连接服务,将无法再设定IP地址等属性。
然后是对外的服务。
netstat -an 查看本地侦听的端口
netstat -n 本地建立的连接
listening是表示正在侦听的端口。
445:访问共享(使用IP地址)
135:访问共享(计算机名)
139:访问共享
都是些常见的。接下来我们启用远程桌面(TCP-3389)。
mstsc命令可以使用远程桌面
我们可以看到,建立了一个连接,端口是3389,来自于同一个局域网的1062端口(我的另一台虚拟机)。这就是端口连接。
这次我们添加流媒体服务器、POP3/SMTP、FTP等多种服务后,再来查看连接
用来远程测试目标端口是否可达。并不是只要服务器端口侦听就能访问成功,防火墙可能会导致端口虽然在侦听,但是无法访问的情况出现。
telnet IP/计算机名 端口
如图可以知道访问哪个端口可以成功,如果端口访问不成功,则使用对应服务的应用程序和请求服务必然无法执行。
也可以进行端口扫描,来看服务器开启了哪些端口,从而判断服务器运行了什么服务,再找漏洞来进行进一步攻击。
端口必须唯一,才能建立连接提供正常访问。
客户端计算机访问服务器时,一般是临时打开的端口,这些端口来回分别作为源/目标端口来封装数据包。如果出现端口冲突,则会无法访问到目标或服务无法启动等。
比如,如果我们将一个服务故意设置成80端口,然后重启web服务器,那么此时web服务就会因为端口被占用而无法启用,网络中想要访问服务器的客户端自然无法访问。
上图是两个以80端口为服务端口的服务器在第一个启动时第二个想要启动时引发的错误。
netstat -anb
上命令可以查看端口对应的应用程序,从而来观察 是哪个应用程序占用了本该启用服务器的端口。
端口可以修改端口,修改端口后客户端访问还是使用的默认端口,也就无法访问了。客户端访问时需要人工指定目标端口,否则将无法访问。
下面我们就来看一下端口更改以及对应的操作改变。
当不改变端口时,端口默认80.
将端口改为8080,发现无法访问这个网页了。
然后我们人工指定端口为8080后,则可以正常访问。
FTP:
将端口改为211:
ftp://192.168.80.123:211/ (Win10系统自动过滤了端口)实际上是有的
并不是所有端口都可以用图形化界面的改,我们可以通过注册表来改。
然后我们登陆outlook,并自己给自己发邮件。并且对POP和STMP进行一个修改,邮件就不能正常发送。
像远程桌面这种,没有图形化界面可以修改,必须使用注册表修改。
位置在LOCAL_MACHINE/SYSTEM/CurrentControl/Control/Terminal Server/WinStation/RDP-Tcp
里面有一个portnumber
可以直接在这里修改端口。修改后,远程访问也必须使用:来指定端口。
端口层面的网络安全,其实就是只开放需要开放的端口,关闭其他端口,从而导致屏蔽恶意流量实现网络安全。
上图的情况中,数据库即便有安全隐患也无妨,也为入侵数据库的流量进不来;但是如果网络有安全漏洞(通过80端口访问web的流量会进而影响数据库),就会出现安全问题。
同理,可以使用端口来限制内网流量,达到只允许内网做部分行为的目的,其他流量就会被阻断。如图,假设只开放80端口,则使用25端口的邮件服务器将无法被访问,因为流量会被路由器的防火墙隔断,出不去。客户端虽然可以认为修改端口,但是由于修改的端口与服务器端口必须一致,而服务器不会因为内网内个人变更端口,所以虽然修改端口能够让流量出去,却无法完成访问(流量回不来)。
windows防火墙只拦截进来的流量,默认允许出去的流量,且出去的流量返回数据包时,会临时开启端口。
防火墙启用后,如果勾选不允许例外,则意味着屏蔽TCP/UDP协议的所有端口,计算机将进入一种安全状态。这种安全状态会阻挡所有外来流量。
而如果允许例外,则可以给防火墙开指定的端口
比如开放远程桌面(默认3389,如果修改后需要重新设置)、FTP端口等。可以使用telnet命令来尝试连接端口。
windows防火墙是需要一个服务来支持的,如果这个服务被停掉,则防火墙就没用了。就好比一个哨兵与岗哨,哨兵被杀死,岗哨虽然设立但是徒有其表,没有抵御入侵的能力了。
比防火墙更安全的设置方式:
图中就是只允许UDP的80端口流量访问,从网络层上就局限了端口流量的进入,其实也相当于端口控制。这种端口控制即便在防火墙瘫痪的情况下仍然可以使用。
假如一个服务器只提供web服务,那么我们就可以设置它只开启80端口,使用TCP筛选甚至可以在防火墙down的时候保证端口流量限制。