早知如此绊人心,何如当初莫相识
前言
手机和手机之间的通信其实是手机之间的进程和进程之间的通信,所以这一章主要是研究进程之间通信的问题,在计算机网络中有一个重要的问题,在进行数据通信和资源共享的时候如何来保证数据是准确的,或者说如何在一个可能会数据丢失的数据媒体上可靠的来传输我们的数据,这个就是TCP协议发挥作用的地方,UDP协议与TCP协议相比较就是一个不太可靠的协议,那么可能在传输对数据准确性要求不那么高,在传输延迟方面要求比较高,通常会使用UDP协议,
传输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层,为运行在不同主机上的进程之间提供了逻辑通信
输层提供应用进程之间的逻辑通信( 即端到端的通信)
传输层的功能:
复用:发送方不同的应用进程都可使用同一个传输层协议传送数据
分用:接收方的传输层在剥去报文的首部后能够把这些数据正确交付到目的应用进程
传输层还要对收到的报文进行差错检测(首部和数据部分)
提供两种不同的传输协议,即面向连接的TCP和无连接的UDP
向高层用户屏蔽低层网络核心的细节(如网络拓扑、路由协议等,使应用进程好像在两个传输层实体之间有一条端到端的逻辑通信信道
复用是指发送方不同的用户进程它们都可以使用传输层的协议来传送数据,而这个分用是指接收方传输层在剥去报文的首部之后能够送给正确的进程,传输层的转送单元报文段。我们之前学过的网络层有一个首部校验和但是只是校验头部,但是没有校验数据部分,因此需要这个传输层来实现对数据的检错,因为网络层的数据部分就是传输层的报文段,如果传输层对这个报文段进行了差错检测那么网络层就不需再进行差错检测了,就是需要检测IP数据报的头部而不需要检测数据部分,那么可以看出传输层和网络层一起就可以实现一个可靠传输的过程,当然这个传输层不一定会实现一个可靠传输的,这是因为传输层有两个协议,一个叫做TCP一个叫做UDP,.
传输层的寻址与端口:
端口号的作用:端口可以标识主机中的应用进程,让应用层的各种应用进程将其数据通过端口向下交付给传输层,以及让传输层知道应当将其报文段中的数据向上通过端口交付给应用层相应的进程,端口号只有本地作用,在因特网中不同计算机的相同端口是没有联系的。
软件端口和硬件端口:软件端口: 协议栈层间的抽象的协议端口,是应用层的各种协议进程与传输 实体进行层间交互的一种地址,硬件端口: 不同硬件没备进行交互的接口,传输层使用的是软件端口。
端口号分为服务端使用的端口号,客户端使用的端口号,
之前我们说过传输层有一个功能就是复用和分用,
根据IP地址找到他所在的网络,进入他所在的网络之后,就要靠他的MAC地址再定位到具体哪一个主机,找到了主机这个通信还不算结束,应该要找到这个主机中接收这个数据的进程,因此就涉及到传输层的问题,用一个端口指明一个具体的应用进程,
客户端使用的端口号只有再使用的时候才会给它分配一个,而且是主机中的操作系统给它随机分的,这个进程只要一结束,这个端口号就可以分给一个新的进程,所以这个端口号是可以循环利用,是可以动态选择的,又称短暂端口号(也称临时端口): 这类端口号仅在客户进程运行时才动态地选择
通信结束后,刚用过的客户端口号就 不复存在,从而这个口号就可供其他客户进程使用。
套接字:IP地址来标识和区别不同的主机,端口号来标识和区分一台主机中的不同应用进程
在网络中采用发送方和接收方的套接字组合来识别端点(主机号IP地址,端口号),唯一的识别网络中的一台主机和其上的一个进程,实际上是一个通信端点。
面向连接和无连接服务:
面向连接服务:在通信双方进行通信之前,必须先建立连接,在通信过程中,整个连接的情况一直被实时地监控和管理,通信结束后,应该释放这个连接
无连接服务:两个实休之间的通信不需要先建立好连接,需要通信时,直接将信息发送到“网络”中,让该信息的传送在网上尽力而为地往目的地传送,
TCP/IP协议族的传输协议
面向连接的传输控制协议(TCP ), 采用TCP时,传输层向上提供的是一条全双工的可靠逻辑信道
无连接的用户数据报协议(UDP): 采用UDP时,传输层向上提供的是一不可靠的逻辑信道
TCP/IP协议
TCP提供面向连接的可靠传输服务,增加了许多开销,如确认、流量控制、计时器及连接管理等
TCP主要适用于可靠性更重要的场合,如文件传输协议(FTP )超文本传输协议(HTTP )、远程登录(TELNET)等
UDP协议
在IP之上仅提供两个附加服务:多路复用和对数据的错误检查,远程主机的传输层收到UDP报文后,不需要给出任何确认
远程主机的传输层收到UDP报文后,不需要给出任何的确定。
UDP简单,执行速度比较快、实时性好
UDP的应用有: 小文件传送协议(TFTP)。DNS.SNMP和实时传输协议( RTP)
网络层若是采用虚电路方式,则无法提供无连接服务,而传输层采用TCP不影响网络层提供无连接服务,
根据IP地址可以找到主机,根据端口号可以找到主机具体的进程。
UDP数据报:
UDP实现了传输协议能够做的最少工作,在IP的数据报服务之上增加了两个最基本的服务:复用和分用以及差错检测。
UDP优点:UDP无须建立连接,不会有建立连接的时廷。无连接状态 UDP不维护连接状态,应用服务器使用UDP时。一般都能支持更多的活动客户机,分组首部开销小。
特点
UDP常用于一次性传输数少数据的
UDP提供最大努力的交付,即不保证可靠交付,所有维护传输可靠性的工作需要用户在应用层来完成,UDP是面向报文的,报文是UDP数据报处理的最小单位
UDP的首部格式
源端口 : 源端口号。在需要对方回信时选用,不需要时可用全0
目的端口 : 这在终点交付报文时必须使用到,
长度: UDP数据报的长度(包括首部和数据 )其最小值是8(仅有首部)
校验和:检测UDP数据报在传输中是否有错。有错就丢弃,是可选的,当源主机 不想计算校验和时,则直接令该字段为全0
收到数据报:根据首部中的目的端口,把UDP数据报通过相应的端口交给应用进程,如果接收方UDP发现收到的报文中的目的端口号不正确,丢弃该报文,并由ICMP发送“端口不可达”差错报文给发送方
UDP校验:
UDP的校验和只检查首部和数据部分
校验时,若UDP数据报部分的长度不是偶数个字节,则需填入一个全0字节
如果UDP校验和校验出UDP数据报是错误的,那么可以,丢弃,也可以交付给上层,但是需要附上错误报告,通过伪首部,不仅可以检查源端口号。目的端口号和UDP用户数据报的数据部分,还可以检查IP数据报的源IP地址和目的地址,检错能力并不强
网络层是不可靠交付,若是使用UDP也是不可靠的交付,那么就只有应用层来保证可靠,以及顺序的交付,
面向报文的意思就是,首先一个应用层的程序会产生一个应用层的报文,应用层报文就作为应用层的传输单元往下传输,根据不同的协议加上不同的首部,所谓面向报文就是对于这个报文的长度大小是不做改变的,也就是应用层给UDP多长的报文,UDP就照旧发送,即一次发一个完整报文,
无拥塞控制有时也是很有用的,比如视频通话,尽管丢失一些画面,也是无伤大雅,
注意这个数据字段是可以为零的,所以这个UDP的数据报最少是8B,源端口号是可有可无的,若是我发送的数据报我希望收到对方的回复,那么这个源端口号我就希望填上,目的端口号是一定要存在的,UDP长度是整个用户数据报的长度,检验和也就是包括首部字段和数据字段是否是发送错误了,若是发生错误了也就会把这个UDP用户数据报丢弃,那还有一种出错的情况就是我们在分用的时候,也就是网络层交给用户层的数据报,这些数据报去找各自所对应的用户进程,也就是根据端口号来找,若是找不到进程,就会把整个数据报丢弃
发送端和接收端在校验这个数据和首部有没有出错的时候,才会出现这个伪首部,在传输的过程中这个伪首部自始至终都是不会出现的,
第三步中,若是每一个横条都是可以满足4B的话,就不需要填充,
第四步也就是右边的这种方式,
TCP协议的特点:
TCP是在不可靠的IP层之上实现的可靠的数据传输协议,它主要解决传输的可靠、有序、 无丢失和不重复问题
特点:
TCP是面向连接的传输层协议
每条TCP连接只能有两个端点,每条TCP连接只能是点对点的(一对一)
TCP提供可靠的交付服务,保证传送的数据无差错、不丢失、不重复且有序
TCP提供全双工通信,允许通信双方的应用进程在任何时候都能发送数据,为此TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据
TCP是面向字节流的
TCP报文段:
TCP传送的数据单元称为报文段
作用 运载数据,建立连接、释放连接和应答
所谓面向连接就是在传输数据之前要先建立好一个TCP连接,再传送完数据之后在释放这个已经建立的连接,将这个数据报加上各个层次的首部之后,放在链路上传输,然后在接收端进行一步又一步的解封装,这个是一个完整的物理连接,但是TCP好像是建立了一种点对点的连接,因此我们说是一种虚连接,TCP是没有办法应用于广播或者多播的方式,
面向字节流的含义就是虽然应用进程和TCP的交互每一次都是发送一个数据块,这个数据块的大小可以是不一样的,但是TCP会把这个应用程序交下来的数据看作是一连串的无结构的字节流,
TCP是面向字节的。对每个字节进行编号,但并不是接收到每个字节都要发回确认,而是在发送一个报文段的字节后才发回一个确认,所以TCP采用的是对报文段的确认机制。
取123字节组成一个TCP的报文段,然后这个报文段加上TCP的头部,然后形成一个完整的报文段放在链路上进行传输,当然所携带的字节的个数是不定的,有很多的因素,
TCP报文段在首部除了有20B字节的固定首部之外,还有选项,一个长度可变的字段,TCP有强迫症想要这个首部是4字节的整数倍,也就是4N字节,所以需要一个填充字段来进行补齐,
就像上上图中序号是1,而下图中就是11,
只有收到一个确认之后才会发送一个新的报文段,确认号字段上图就应该是4,
这个首部加了这个选项字段,这个数据部分就不知道从哪里开始的,所以就需要一个数据偏移字段来规定首部有多长
本来发送方发送的好好的,突然接受方说不能接收文件了,说你赶快停止,发送方收到这个一个信息之后,它就应该叫停,发送方的叫停一定是要输入一些命令,这些命令的体现就是新加入了一些数据,这些数据就会进入这个TCP缓存中,这个时候使得它的URG等于1,就说明这是一个紧急的数据,紧急的报文段,就应该赶紧发送,而不应该在缓存中排队,
PUSH主要是接受方进行的一个紧急处理,也就是若是TCP缓存中若是某一个报文段push==1需要赶紧的交付给应用层上面的进程,
这个窗口字段也就是可以容纳的最大的字节流,或者说数据量是多少,根据接收方的窗口大小来设置发送方的发送缓存。
在UDP中协议字段是17而TCP中是6,
紧急指针就是告诉紧急数据的位置以及它总共占的字节数,
总结:
源端口和目的端口字段:各占2B,端口是运输层与应用层的服务接口,运输层的复用和分用功能都要通过端口实现
序号字段:占4B,TCP是面向字节流的(即TCP传送时是逐个字节传送的),所以TCP 连接传送的数据流中的每个字节都编上一个序号,序号字段的值指的是本报文段所发送的数据的第一个字节的序号
确认号字段:占4B,是期望收到对方的下一个报文段的数据的第一个字节的序号
数据偏移(即首部长度):占4位,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远
保留字段: 占6位,保留为今后使用
紧急位URG:URG= 1时,表明紧急指针字段有效。它告诉系统报文段中有紧急数,应尽快传送(相当于高优先级的数据)
确认位ACK:ACK=1时确认号字段才有效,ACK = 0时,确认号无效,tcp规定,在连接建立后所有传送的报文都必须把ack置1
推送位PSH( Push :接收TCP收到PSH=1的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满后再向上交付
复位位RST(Reset)RST=1时,表明TCP连接中出现严重差错( 如主机溃或其他原因),必须释放连接,然后再重新建立运输连接
同步位SYN:SYN=1表示这是一个连接请求或连接接收报文
终止位FIN ( Finish ):用来释放一个连接。FIN= 1表明此报文段的发送方的数据已发送完毕,并要求释放传输连接
窗口字段:占2B,表示允许对方发送的数据量,单位为字节
校验和:占2B,校验和字段检险的范围包括首部和数据两部分
紧急指针字段:占16位,指出在本报文段中紧急数据共有多少字节(紧急数据放在本报文段数据的最前面)
选项字段:长度可变,TCP最初只规定了一种选项,即最大报文段长度
填充字段:使整个首部长度是4B的整数倍
TCP连接的管理就是使运输连接的建立和释放都能正微进行
连接阶段:连接建立,数据传送,连接释放
TCP连接建立时面对的问题:要使每一方都能够确知对方的存在,要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项、时间戳选项及服务质量等了),能够对运输实体资源(如存大小,连接表中的项目等)进行分配
连接的建立(三次握手):1,客户机的TCP首先向服务器的TCP发送一个连接请求报文段SYN=1,seg=X。2,服务器的TCP收到连接请求报文段后,如同意建立连接,就向客户机发回确认,并为该TCP连接分配TCP缓存和变量SYN=1,ACK =1,ack= X+1,seq = y。3,当客户机收到确认报文段后,还要向服务器给出确认,并且也要给该连接分配缓存和变量ACK=1,seq = X+1,ack = y+1
连接的释放( 四次挥手 ):1,客户机向其TCP发送一个连接释放报文段,并停止发送数据,主动关闭TCP连接FIN = 1,seq = U。2,服务器收到连接释放报文段后即发出确认ACK =1,seq = V,ack=u+1,3,服务器通知客户端TCP穿放连接,FIN = 1,ACK = 1,seg = w,ack = u+l。4,客户机受到连接释放报文后,发出确认ACK =1,seq = u+1,ack = w+1
无应用层数据意思就是无数据部分,只是一个连接请求的作用,
这个seq就是序号位占32bit,这个时候的确定位是没有意义的,
两者都是可以发送或接收的话,那么每一方都是有两个缓存,发送和接收的缓存,接下来这个服务器端就要为接下来的数据通信做好准备,也就是分配好一个缓存以及相应的变量,并且向客户端发一个确认的报文段,就是告诉它,已经收到你的报文请求了,允许发送端发送数据了,注意确认报文段依然是没有数据部分的,注意有了大写的ACK就一定要有小写的ACK,
并且可以看到在第二步和第三步服务器端和客户端分别为TCP过程分配了缓存和变量,并且第三次的序号位是为x+1因为第一步的时候是发送了一个x,
SYN洪泛攻由发生在OSI第四层,这种方式利用TCP协议的特性,就是三次握手
攻击者发送TCP SYN,SYN是TCP三次握手中的第一个数据包,而当服务器返回ACK后,该攻击者就不对其进行再确认,那这个TCP连接就处于挂起状态,也就是所谓的半连接状态,服务收不到再确认的话,还会重复发送ACK给攻击者
文章来源:https://www.toymoban.com/news/detail-707392.html
连接释放的报文段中有哪些比较特别的字段,因为这个时候是要请求释放这个连接,FIN结束位这个FIN就应该标为1了,seq就是指这样一个报文段的第一个字节的序号,由于这样一个报文段都是没有数据的,所以这样一个序号也能标记这样一个报文段,
所谓的半关闭就是指客户停止了发送数据,而服务器依然是可以发送数据,
主机对第二步中的这个也不用给与回复,只需要等待服务器告诉他也结束就可以了,
注意第二步和第三步的确认号是一样的,因为客户并没有发送数据,
若是第三步的时候这个丢失了,客户就一直收不到第三个报文段,就会一直重发,B就没有办法进入关闭状态,所以需要一个AMSL时间,
有大写的ACK一定有小写的ack,而建立和释放的第一步都是没有ACK的。文章来源地址https://www.toymoban.com/news/detail-707392.html
到了这里,关于计算机网络第五章——传输层(上)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!