传输层就俩协议:TCP和UDP协议。接下来重点介绍这两种协议。
1 传输层两个协议的区别
TCP:需要将要传输的文件分段传输,建立会话,具有可靠传输、流量控制、拥塞控制等功能。
UDP:一个数据包就能够完成数据通信,不分段,不需要建立会话,不需要流量控制,是不可靠传输。DNS域名解析、QQ聊天、屏幕广播、多播、广播(因为没有建立会话)都是应用了UDP协议的例子。
2 传输层协议和应用层协议的关系
传输层协议+端口号=应用层协议,如下图:
常见的应用层协议使用的端口:
HTTP=TCP+80
HTTPS=TCP+443
远程桌面RDP=TCP+3389
FTP=TCP+21
共享文件夹=TCP+445
SMTP=TCP+25
POP3=TCP+110
TELNET=TCP+23
SQL=TCP+1433
DNS=UDP+53
在网络层,是通过IP地址来定位数据包发给哪个主机;而在传输层,是通过端口号来定位数据包发给主机里的哪个服务。选择了哪个端口,意味着选择哪个应用层服务。端口号和服务一一对应。比如,黑客在入侵之前都要先扫描一下目标主机开了哪些端口。根据开的端口,就可以确定目标主机提供哪些服务。比如,扫描到了3389端口,就意味着目标开了远程桌面服务,就可以对目标发起远程桌面请求来进行攻击。
3 服务和应用层协议之间关系
当然了,服务和协议也是一一对应的。每个服务都得需要一个相应的协议来保证通信。
服务端使用TCP或UDP的端口侦听客户端请求;客户端使用IP地址定位服务器,使用目标端口定位服务。
可以在服务器网卡上设置只开放必要的端口,实现服务器网络安全。也就是俗称的防火墙。防火墙的作用就是设置开放哪个端口、关闭哪个端口,可以对入侵进行一定的拦截。如图所示,关闭防火墙的1433端口,防止外界入侵数据库。
几个常用命令:
查看服务侦听的端口 netstat -an
查看建立的会话 netstat -n
查看某个特定状态的会话 netstat -n | find "ESTABLISHED"
查看建立会话的进程 netstat -nb
测试远程计算机192.168.80.100的3389端口是否打开 telnet 192.168.80.100 3389
4 传输层的功能、端口号
传输层为应用进程之间提供端到端的逻辑通信(网络层提供的是主机之间的逻辑通信);提供面向连接的TCP服务和无连接的UDP服务。
端口号:只具有本地意义,端口号只是为了标志本计算机应用层中的各进程。一台计算机内端口号不能重复。不同计算机的端口号之间无关。
端口号用16位二进制表示。常见的已经被应用程序占用的端口号范围是0—1023(见上面)。登记端口号范围是(给后来开发程序的人员申请端口用)1024—49151。客户端口号范围是49152—65535。
5 UDP协议
UDP协议的特点
(1)UDP是无连接的,即发送数据之前不需要建立连接,因此减少了开销和发送数据之前的时延。
(2)UDP使用尽最大努力交付,即不保证可靠交付。
(3)UDP是面向报文的,发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给网络层。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。
(4)UDP没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。这对某些实时应用是很重要的。
(5)UDP支持一对一、一对多、多对一和多对多的交互通信。
(6)UDP的首部开销小,只有8个字节,比TCP的20个字节的首部要短。
UDP的首部包括四个字段:源端口、目标端口、长度(指的是UDP用户数据报的总长度)和校验和,每个字段的长度是两个字节。
伪首部包括:源地址、目的地址、UDP数据长度、协议类型(0x11),协议类型就一个字节,但需要补一个字节的0x0,构成12个字节。伪首部在计算检验和时才加。
6 TCP协议
6.1 TCP协议的特点
(1)TCP是面向连接的传输层协议。应用程序在使用TCP协议之前,必须先建立TCP连接。在传送数据完毕后,必须释放已经建立的TCP连接。这就是说,应用进程之间的通信好像在“打电话”:通话前要先拨号建立连接,通话结束后要挂机释放连接。
(2)每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的(一对一)。
(3)TCP提供可靠交付的服务。无差错、不丢失、不重复、且按序发送。
(4)TCP提供全双工通信。A给B发送数据,B要不断反馈,告诉A 我收到了哪些,没收到哪些。TCP连接的两端都设有发送缓存和接收缓存,应用程序负责把传输的文件分段(随便分段)放到缓存中;TCP协议将文件从缓存中拿出来发送出去。接收缓存收到文件段之后,由应用程序从缓存中读出。
(5)面向字节流。TCP中的“流”指的是流入到应用程序或从应用程序流出的字节序列。
6.2 TCP报文段首部格式
(1)源端口和目的端口:各占2个字节,分别写入源端口号和目的端口号。
(2)序号:占4字节。序号增加到最大后,下一个序号就又回到0。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。序号指的是本数据包的数据部分的第一个字节是整个文件的第几个字节。
(3)确认号:占4字节,是期望收到对方下一个报文段的第一个数据字节的序号。
TCP协议能够实现可靠传输,接收方收到几个数据包后,就会给发送方一个确认数据包,告诉发送方下一个数据包该发第多少个字节了。
若确认号是N,则表明:到序号N-1为止的所有数据都已正确收到。
(4)数据偏移:占4位,它指出TCP报文段从第几个字节开始是数据。这个字段实际上是指出TCP报文段的首部长度。由于首部中还有长度不确定的选项字段,因此数据偏移字段是必要的。但请注意,“数据偏移”的单位为4B,由于4位二进制数能够表示的最大十进制数字是15,因此数据偏移的最大值是60字节,这也是TCP首部的最大长度,这也就意味着选项长度不能超过40字节。
(5)保留:占6位,保留为今后使用,但目前没用。
(6)紧急URG(URGent):当URG=l时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据),而不要在发送缓存中排队。即“先发”。
(7)确认ACK(ACKnowlegment):仅当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1。
(8)推送PSH(PuSH):和紧急位对比来记。当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应。它告诉系统快点把此数据包从接收缓存中取出给应用程序而不用排队等候接收。即“先收”。
(9)复位RST(ReSeT):当RST=l时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
(10)同步SYN(SYNchronization):在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK=1。因此,SYN置为1就表示这是一个连接请求或连接接受报文。
(11)终止FIN(FINish意思是“完”、“终”):用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据己发送完毕,并要求释放传输连接。
(12)窗口:占2字节。窗口值是[0,216-1]之间的整数。计算机在通信之前,双方需要先告诉对方各自的缓存,然后根据对方的缓存大小设置自己的发送窗口。
TCP协议有流量控制功能,窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(就是告诉对方自己还有多少缓存。单位是字节)。
(13)检验和:占2字节。检验和字段检验的范围包括首部和数据这两部分。和UDP用户数据报一样,在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。
(14)紧急指针:占2字节。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)。因此紧急指针指出了紧急数据的末尾在报文段中的位置。
(15)选项:长度可变,最长可达40个字节。当没有使用选项时,TCP的首部长度是20字节。TCP最初只规定了一种选项,即最大报文段长度MSS(Maximum Segment Size)。
6.3 TCP实现可靠传输
ARQ自动重传请求协议实现可靠传输:
(1)最简单的情况:A发一个包,B给个确认;A收到确认后再发一个包,B再给个确认... ...
(2)累计确认:第一种情况效率太低,现在进行了改进。让A连续不断地发包,B返回收到的连续的序号里最后一个序号。如A一口气发了1,2,3,4,5五个包,B收到后给个确认“我收到了5,请给我发6”;然后A收到确认后连续发6,7,8,9,B收到后再给确认“我收到了9,请给我发10”... ...如果A发送6,7,8,9途中8丢了,B收到了6,7,9,则B确认“我收到了7,请给我发8”,A再发8,9,10... ...
(3)选择确认:上面的最后一种情况中,第9个包重复发送,这样原先已经正确传输的分组也可能重复发送,降低了TCP性能。为改善这种情况,发展出SACK选择确认技术,使TCP只重新发送丢失的包,不用发送后续所有的分组,而且提供相应机制使接收方能告诉发送方哪些数据丢失,哪些数据已经提前收到等。
6.4 TCP实现流量控制
通信双方动态协商窗口大小:接收方每次确认时,都会给发送方一个接收窗口大小的值,发送方根据接收窗口的大小动态调整发送窗口的大小。
6.5 TCP实现拥塞控制
流量控制和拥塞控制的区别
流量控制是两台计算机的事,点对点通信,双方协商发送数据的快慢,以便接收端能来得及接收。而拥塞控制是网络堵了,是网上一堆计算机的事,涉及所有主机和路由器。
慢开始算法
TCP连接初始化后,拥塞窗口(发送窗口)先设成1(单位报文段。下图的窗口单位是字节,注意区别),先成指数增长,长到门限值后线性增长。当网络出现严重丢包时认为出现拥塞,这时拥塞窗口降到1,开始新的一轮增长。
快重传和快恢复算法
快重传算法首先要求接收方每收到不连续的分组后就立即发出三个重复确认(为的是使发送方及早知道有分组丢了)而不要等待自己发送数据时才进行捎带确认。
快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段而不必继续等待为其设置的重传计时器到期。
综上所述,发送窗口是动态变化的,是拥塞窗口和接收窗口的最小值。swnd=min[cwnd, rwnd]
刚开始是由拥塞窗口控制,后来由接收窗口控制。
6.6 TCP的连接管理
三次握手建立连接
为什么TCP建立连接要进行三次握手?前两次不就够了吗?
为了在不可靠信道上可靠地传输信息。
如果没有第三次的确认,设想这样一种情景:A对B打招呼“嗨在吗,我要和你建立连接!”这个招呼传播的很慢,B没有在规定时间内收到,于是A认为这个招呼在传输过程中丢了。A再向B打招呼“嗨在吗,我要和你建立连接!”这回B收到了,回应“我在!”于是A和B连上了。然而,突然这时,A第一次发的招呼经过漫长的跋山涉水终于到达了B。B以为A要重新建立一个新的连接,于是切断之前正常的连接,回应了这个失效的连接。B回应完,就在那傻等着A给自己传数据。然而A根本没有发出新的连接的请求,不搭理B给的回应。这样既造成了通信的失败,也白白浪费了信道资源。采用“三次握手”的办法可以防止上述现象发生。
这里引用一下这个问题在知乎问答里得赞数最多的一位匿名用户的回答(链接:https://www.zhihu.com/question/24853633/answer/114872771):
三次握手:
“喂,你听得到吗?”
“我听得到呀,你听得到我吗?”
“我能听到你,今天balabala……”
两次握手:
“喂,你听得到吗?”
“我听得到呀”
“喂喂,你听得到吗?”
“草,我听得到呀!!!!”
“你TM能不能听到我讲话啊!!喂!”
“……”
四次握手:
“喂,你听得到吗?”
“我听得到呀,你听得到我吗?”
“我能听到你,你能听到我吗?”
“……不想跟傻逼说话”
应用:利用TCP的三次握手机制进行网络攻击
Syn攻击原理:攻击电脑编了一堆不存在的源IP地址,向被攻击电脑发起TCP连接请求。被攻击电脑给这些不存在的电脑回复这些请求,但是由于源IP地址并不存在,也就是说发起请求的电脑不存在,不会给它回复,它就一直等啊等。
Land攻击原理:攻击电脑把发起TCP请求的数据包的源IP和目标IP都写成被攻击电脑的IP,让被攻击电脑不停地自己和自己建立会话,陷入死循环。