tcp和udp属于“传输层”协议。udp和tcp是 计算机传输层中重要的协议,tcp是面向连接的,udp是面向无连接的。tcp(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由ietf的rfc 793定义。udp(用户数据报协议)为应用程序提供了一种无需建立连接就可以发送封装的ip数据包的方法。
本教程操作环境:windows7系统、Dell G3电脑。
计算机网络体系结构是指计算机网络层次结构模型,它是各层的协议以及层次之间的端口的集合。在计算机网络中实现通信必须依靠网络通信协议,广泛采用的是国际标准化组织(ISO)1997年提出的开放系统互联(Open System Interconnection,OSI)参考模型,习惯上称为ISO/OSI参考模型。
OSI七层参考模型:
OSI从逻辑上,把一个网络系统分为功能上相对独立的7个有序的子系统,这样OSI体系结构就由功能上相对独立的7个层次组成,如下图所示。它们由低到高分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
TCP/IP参考模型
TCP/IP共有4个层次,它们分别是网络接口层、网际层、传输层和应用层。TCP/IP层次结构与OSI层次结构的对照关系如下图所示。
tcp和udp属于计算机网络体系结构的“传输层”协议。
Internet 的传输层有两个主要协议,互为补充。无连接的是 UDP,它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外,几乎没有做什么特别的事情。面向连接的是 TCP,该协议几乎做了所有的事情。
- 复用:发送方不用的应用进程都可以使用同一个运输层协议传送数据据
- 分用:接收方的运输层在剥去报文的首部后能够把这些数据正确交付到目的应用进程;
网络层和运输层的区别:网络层是为主机之间提供逻辑通信,而运输层为应用程序直接提供端到端的逻辑通信;
UDP和TCP是计算机传输层中重要的协议,TCP是面向连接的,UDP是面向无连接的;
TCP/IP层中的运输层用一个16位的端口号来表示一个端口,端口号只有本地意义,是为了标志计算机应用层中的各个进程和运输层中交互之间的层间接口,不同的网络号之间的端口号是没有关联的;因此,两个计算机之间的进程要进行相互通信,就必须知道对方的IP地址(为了找到对方的计算机)和端口号(为了找到计算机中的进程),因特网上的通信采用客户端-服务器的方式,客户在发起通信请求时,必须先知道对方服务器的IP地址和端口号。
用户数据报协议只在IP报文上增加了一个复用、分用以及差错检测的功能。
1. UDP的特点
- UDP无连接:发送之前不需要建立连接;
- UDP使用尽最大努力交付,不保证可靠交付;
- UDP面向报文。如下图,一次传送一个完整的报文;
- UDP没有拥塞控制;
- UDP支持一对一、一对多、多对一和多对多的交互通信;
- UDP首部开销小;
2. UDP报文
首部字段只有 8 个字节,包括源端口、目的端口、长度、检验和。12 字节的伪首部是为了计算检验和临时添加的。
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。
TCP:用户报文协议,面向连接,在传输数据之前必须先建立连接,数据传输结束之后释放连接,TCP不提供广播或多播服务。
1. TCP特点
- TCP面向连接,提供可靠交付;
- 有流量控制;
- 拥塞控制;
- 提供全双工通信;
- 面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),每一条 TCP 连接只能是点对点的(一对一)。
2. TCP的连接
3. TCP报文段首部格式
- 源端口和目的端口:各占2个字节,分别写源端口和目的端口;
- 序号:4个字节,TCP面向字节流,在TCP连接中传送的字节流每一个字节都按照顺序编号,整个要传送的字节流的起始号序号必须要在传输建立时设置;
- 确认号 :期望收到的下一个报文段的序号。例如 B 正确收到 A 发送来的一个报文段,序号为 501,携带的数据长度为 200 字节,因此 B 期望下一个报文段的序号为 701,B 发送给 A 的确认报文段中确认号就为 701。
- 数据偏移 :指的是数据部分距离报文段起始处的偏移量,实际上指的是首部的长度。
- 确认 ACK :当 ACK=1 时确认号字段有效,否则无效。TCP 规定,在连接建立后所有传送的报文段都必须把ACK 置 1。
- 同步 SYN :在连接建立时用来同步序号。当 SYN=1,ACK=0 时表示这是一个连接请求报文段。若对方同意建立连接,则响应报文中 SYN=1,ACK=1。
- 终止 FIN :用来释放一个连接,当 FIN=1 时,表示此报文段的发送方的数据已发送完毕,并要求释放连接。
- 窗口 :窗口值作为接收方让发送方设置其发送窗口的依据。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。
4. TCP三次握手
假设 A 为客户端,B 为服务器端。
- 首先 B 处于 LISTEN(监听)状态,等待客户的连接请求。
- A 向 B 发送连接请求报文,SYN=1,ACK=0,选择一个初始的序号 x。
- B 收到连接请求报文,如果同意建立连接,则向 A 发送连接确认报文,SYN=1,ACK=1,确认号为 x+1,同时也选择一个初始的序号 y。
- A 收到 B 的连接确认报文后,还要向 B 发出确认,确认号为 y+1,序号为 x+1。
- B 收到 A 的确认后,连接建立。
5. TCP四次挥手
以下描述不讨论序号和确认号,因为序号和确认号的规则比较简单。并且不讨论 ACK,因为 ACK 在连接建立之后都为 1。
- A 发送连接释放报文,FIN=1。
- B 收到之后发出确认,此时 TCP 属于半关闭状态,B 能向 A 发送数据但是 A 不能向 B 发送数据。
- 当 B 不再需要连接时,发送连接释放报文,FIN=1。
- A 收到后发出确认,进入 TIME-WAIT 状态,等待 2 MSL(最大报文存活时间)后释放连接。
- B 收到 A 的确认后释放连接。
四次挥手的原因
客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送 FIN 连接释放报文。
TIME_WAIT
客户端接收到服务器端的 FIN 报文后进入此状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间 2MSL。这么做有两个理由:
- 确保最后一个确认报文能够到达。如果 B 没收到 A 发送来的确认报文,那么就会重新发送连接释放请求报文,A 等待一段时间就是为了处理这种情况的发生。
- 等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文。
TCP使用超时重传来实现可靠传输,如果一个已经发送给的报文段在超时间内没有收到确认,那么就重传这个报文段;
1. TCP滑动窗口
窗口是缓存的一部分,用来暂时存放字节流。发送方和接收方各有一个窗口,接收方通过 TCP 报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和其它信息设置自己的窗口大小。
发送窗口内的字节都允许被发送,接收窗口内的字节都允许被接收。如果发送窗口左部的字节已经发送并且收到了确认,那么就将发送窗口向右滑动一定距离,直到左部第一个字节不是已发送并且已确认的状态;接收窗口的滑动类似,接收窗口左部字节已经发送确认并交付主机,就向右滑动接收窗口。
接收窗口只会对窗口内最后一个按序到达的字节进行确认,例如接收窗口已经收到的字节为 {31, 34, 35},其中 {31}按序到达,而 {34, 35} 就不是,因此只对字节 31 进行确认。发送方得到一个字节的确认之后,就知道这个字节之前的所有字节都已经被接收。
2. TCP流量控制
TCP上的流量控制就是通过滑动窗口实现,一般来说,都是希望发送方发送的数据越快越好,但是发送方发送的数据过快会导致接收方来不及接受,因此就需要控制发送方的流量,TCP上的流量控制主要是通过设置滑动窗口大小实现,接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为0,则发送方不能发送数据。
3. TCP拥塞控制
如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制发送方的速率。这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度。
拥塞控制条件:
拥塞控制和流量控制不同:拥塞控制是防止过多的数据注入到网络中,这样使网络中的路由器或链路不至于过载,拥塞控制是一个全局的过程,设计到所有的主机所有的路由器,以及与降低网络性能相关的所有的元素,但是,流量控制往往是点对点通信量的控制,是个端到端的问题,要注意区分;
TCP中拥塞控制的主要算法:慢开始、拥塞避免、快重传、快恢复
发送方需要维护一个叫做拥塞窗口(cwnd)的状态变量,注意拥塞窗口与发送方窗口的区别:拥塞窗口只是一个状态变量,实际决定发送方能发送多少数据的是发送方窗口。
为了便于讨论,做如下假设:
- 接收方有足够大的接收缓存,因此不会发生流量控制;
- 虽然 TCP 的窗口基于字节,但是这里设窗口的大小单位为报文段。
1. 慢开始与拥塞避免
发送的最初执行慢开始,令 cwnd = 1,发送方只能发送 1 个报文段;当收到确认后,将 cwnd 加倍,因此之后发送方能够发送的报文段数量为:2、4、8 …
注意到慢开始每个轮次都将 cwnd 加倍,这样会让 cwnd 增长速度非常快,从而使得发送方发送的速度增长速度过快,网络拥塞的可能性也就更高。
设置一个慢开始门限 ssthresh,当 cwnd >= ssthresh 时,进入拥塞避免,每个轮次只将 cwnd 加 1。
如果出现了超时,则令 ssthresh = cwnd / 2,然后重新执行慢开始。
2. 快重传与快恢复
在接收方,要求每次接收到报文段都应该对最后一个已收到的有序报文段进行确认。例如已经接收到 M1 和 M2,此时收到 M4,应当发送对 M2 的确认。
在发送方,如果收到三个重复确认,那么可以知道下一个报文段丢失,此时执行快重传,立即重传下一个报文段。例如收到三个 M2,则 M3 丢失,立即重传 M3。
在这种情况下,只是丢失个别报文段,而不是网络拥塞。因此执行快恢复,令 ssthresh = cwnd / 2 ,cwnd =ssthresh,注意到此时直接进入拥塞避免。
慢开始和快恢复的快慢指的是 cwnd 的设定值,而不是 cwnd 的增长速率。慢开始 cwnd 设定为 1,而快恢复 cwnd设定为 ssthresh。
参考文献:计算机网络第五版谢希仁编著
(学习视频分享:web前端入门)
以上就是tcp和udp属于计算机网络体系结构的什么协议的详细内容,更多请关注php中文网其它相关文章!
到此这篇udp报文的结构图(udp报文和tcp报文的区别)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/cjjbc/14109.html