计算机网络相关协议以及(TCP,UDP区别)

会有一股神秘感。 提交于 2020-04-27 22:31:48

OSI的体系结构:

物理层->数据链路层(ARP协议)->网络层-(OSPF开放最短路径优先协议,Ipv4/v6)>运输层->会话层(SSL安全套接字协议,TLS传输层安全协议,RPC远程过程调用协议)->表示层->应用层

 ARP(地址解析协议)协议在TCP/IP模型里面,它属于网络层。

ARP协议:

数据在传输的过程中,有不断封装过程,到了链路层的话(以太网传输),在以太网的帧格式中会出现目的主机的MAC地址,但是我们从一开始就只知道目的主机的IP地址,所以这里用到了ARP协议(简单来说就是寻找对应目标的MAC地址)

源主机先在自己的ARP缓冲区中寻找映射,如果有(直接填充于以太网帧中),如果没有,通过路由广播请求,这时一些联网的主机就会收到这个请求,并将这个请求传回网络层,对比IP地址,检验是否可以接受,如果不行,则直接丢失这个信息,如果可以那么回复ARP请求(回复里面包含目的主机的MAC地址,应答是单播方式),并且将源主机的MAC地址加入到目的ARP缓冲区中,形成映射,源主机接受到请求后,将目的的MAC地址加入到ARP缓冲区,也形成映射。

RARP协议:

mac地址将mac地址解析为ip地址

五层协议体系结构:

应用层:(包括了上面的会话层,表示层,应用层)

应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统DNS(它作为将域名和ip地址相互映射的分布式数据库),支持万维网应用的 HTTP协议(超文本传输协议,所有的www文件都必须遵守这个标准),FTP文件传输协议,支持电子邮件的 SMTP协议,支持远程登录的Telnet协议等等。我们把应用层交互的数据单元称为报文。

 

运输层:

运输层(transport layer)的主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文。“通用的”是指并不针对某一个特定的网络应用,而是多种应用可以使用同一个运输层服务。由于一台主机可同时运行多个线程,因此运输层有复用和分用的功能。所谓复用就是指多个应用层进程可同时使用下面运输层的服务,分用和复用相反,是运输层把收到的信息分别交付上面应用层中的相应进程。(主要就是TCP,UDP协议

 

  NAT(网络地址转换)知道端口的属于运输层:所有使用本地地址的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全球IP地址,才能和因特网连接。另外,这种通过使用少量的公有IP 地址代表较多的私有IP 地址的方式,将有助于减缓可用的IP地址空间的枯竭。

 SNAT:修改源IP地址从A变成B,使得接收方以为发送的主机是B而不是A

 DNAT:修改目的IP地址从A变B,使得发送方以为自己发送给了A,实际上市发送给了B

 

网络层:

在 计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换结点, 确保数据及时传送。 在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在 TCP/IP 体系结构中,由于网络层使用 IP 协议,因此分组也叫 IP 数据报 ,简称 数据报。

OSPF和BGP

ospf(内部网关协议):它是以链路状态为根据进行选路的,一般运行在AS自治系统内部

bgp:自治系统间路由 (外部网关协议):一般是由ISP服务提供商运用在各个AS之间,用于互联网选路的协议

 

 

数据链路层:

数据链路层(data link layer)通常简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。 在两个相邻节点之间传送数据时,数据链路层将网络层交下来的 IP 数据报组装程帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。

在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始和到哪个比特结束。这样,数据链路层在收到一个帧后,就可从中提出数据部分,上交给网络层。 控制信息还使接收端能够检测到所收到的帧中有误差错。如果发现差错,数据链路层就简单地丢弃这个出了差错的帧,以避免继续在网络中传送下去白白浪费网络资源。如果需要改正数据在链路层传输时出现差错(这就是说,数据链路层不仅要检错,而且还要纠错),那么就要采用可靠性传输协议来纠正出现的差错。这种方法会使链路层的协议复杂些。 

ppp协议(点对点协议):提供连接认证、传输加密以及压缩。 

 

 

物理层:

实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。

 

 

 

 

MAC帧在传送的时候使用的源地址和目的地址都是硬件地址,他们都写在首部。

在数据链路层看不见隐藏在MAC帧的数据中的IP地址。只有在剥去了MAC帧的首部和尾部后把MAC层的数据上交给网络层后,网络层才能在IP数据报的首部中找到源IP地址和目的IP地址。 

TCP,UDP一次发送的最大数据量分析:

分析每一层的大小:

1.在链路层,由以太网的物理特性决定了数据帧的长度为(46+18)-(1500+18),其中的18是数据帧的头和尾,也就是说数据帧的内容最大为1500(不包括帧头和帧尾,1500是链路层的最大传输单元),即MTU(Maximum Transmission Unit最大传输单元)为1500,也就是ip数据包最大1500.
2.在网络层,因为IP包的首部要占用20字节,所以这的MTU为1500-20=1480; 
3.在传输层,对于UDP包的首部要占用8字节,所以这的MTU为1480-8=1472;   
所以,在应用层,你的Data最大长度为1472。当我们的UDP包中的数据多于MTU(1472)时,发送方的IP层需要分片fragmentation进行传输,而在接收方IP层则需要进行数据报重组,由于UDP是不可靠的传输协议,如果分片丢失导致重组失败,将导致UDP数据包被丢弃。   
从上面的分析来看,在普通的局域网环境下,UDP的数据最大为1472字节最好(避免分片重组)。   
但在网络编程中,Internet中的路由器可能有设置成不同的值(小于默认值),Internet上的标准MTU值为576,所以Internet的UDP编程时数据长度最好在576-20-8=548字节以内。
UDP 包的大小就应该是 1500 - IP头(20) - UDP头(8) = 1472(Bytes)
TCP 包的大小就应该是 1500 - IP头(20) - TCP头(20) = 1460 (Bytes)

 

实际的应用:

在实际的应用层:

 用UDP协议发送时,用sendto函数最大能发送数据的长度为:65535(2^16-1)- IP头(20) - UDP头(8)=65507字节(这是最大理论长度)。用sendto函数发送数据时,如果发送数据长度大于该值,则函数会返回错误。  

 用TCP协议发送时,由于TCP是数据流协议,因此不存在包大小的限制(暂不考虑缓冲区的大小),这是指在用send函数时,数据长度参数不受限制。而实际上,所指定的这段数据并不一定会一次性发送出去,如果这段数据比较长,会被分段发送,如果比较短,可能会等待和下一次数据一起发送。

 

运输层的两大协议:

传输控制协议 TCP(Transmission Control Protocol)-- 提供面向连接的,可靠的数据传输服务。传输的形式是字节流

用户数据协议 UDP(User Datagram Protocol)-- 提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)。传输的形式是数据报文段。

关于数据报和流的理解:

1、TCP

打个比方比喻TCP,你家里有个蓄水池,你可以里面倒水,蓄水池上有个龙头,你可以通过龙头将水池里的水放出来,然后用各种各样的容器装(杯子、矿泉水瓶、锅碗瓢盆)接水。

上面的例子中,往水池里倒几次水和接几次水是没有必然联系的,也就是说你可以只倒一次水,然后分10次接完。另外,水池里的水接多少就会少多少;往里面倒多少水,就会增加多少水,但是不能超过水池的容量,多出的水会溢出。

结合TCP的概念,水池就好比接收缓存,倒水就相当于发送数据,接水就相当于读取数据。好比你通过TCP连接给另一端发送数据,你只调用了一次write, 发送了100个字节,但是对方可以分10次收完,每次10个字节;你也可以调用10次write,每次10个字节,但是对方可以一次就收完。(假设数据都 能到达)但是,你发送的数据量不能大于对方的接收缓存(流量控制),如果你硬是要发送过量数据,则对方的缓存满了就会把多出的数据丢弃。

2、UDP

UDP 和TCP不同,发送端调用了几次write,接收端必须用相同次数的read读完。UPD是基于报文的,在接收的时候,每次最多只能读取一个报文,报文和 报文是不会合并的,如果缓冲区小于报文长度,则多出的部分会被丢弃。也就说,如果不指定MSG_PEEK标志,每次读取操作将消耗一个报文。

3、为什么

其实,这种不同是由TCP和UDP的特性决定的。TCP是面向连接的,也就是说,在连接持续的过程中,socket中收到的数据都是由同一台主机发出的(劫持什么的不考虑),因此,知道保证数据是有序的到达就行了,至于每次读取多少数据自己看着办。

而 UDP是无连接的协议,也就是说,只要知道接收端的IP和端口,且网络是可达的,任何主机都可以向接收端发送数据。这时候,如果一次能读取超过一个报文的 数据,则会乱套。比如,主机A向发送了报文P1,主机B发送了报文P2,如果能够读取超过一个报文的数据,那么就会将P1和P2的数据合并在了一起,这样 的数据是没有意义的。

 

UDP不能实现可靠传输?

 丢包和后发先至(包的顺序)

解决方法: 
1)给数据包编号,按照包的顺序接收并存储; 
2)接收端接收到数据包后发送确认信息给发送端,发送端接收确认数据以后再继续发送下一个包,如果接收端收到的数据包的编号不是期望的编号,则要求发送端重新发送。

 

UDT(UDP-based Data Transfer Protocol)
基于UDP的数据传输协议(UDP-based Data Transfer Protocol,简称UDT)是一种互联网数据传输协议。UDT的主要目的是支持高速广域网上的海量数据传输,而互联网上的标准数据传输协议TCP在高带宽长距离网络上性能很差。 顾名思义,UDT建于UDP之上,并引入新的拥塞控制和数据可靠性控制机制。UDT是面向连接的双向的应用层协议。它同时支持可靠的数据流传输和部分可靠的数据报传输。 由于UDT完全在UDP上实现,它也可以应用在除了高速数据传输之外的其它应用领域,例如点到点技术(P2P),防火墙穿透,多媒体数据传输等等。

 

TCP_NODELAY:

用nginx作web缓存的时候,发现在http里加入这样个参数,能有效的提高数据的实时响应性,那就是tcp_nodelay.

通常情况下报头很小,而且套接字上设置了TCP_NODELAY。有报头的包将被立即传输,在某些情况下(取决于内部的包计数器),因为这个包成功地被对方收到后需要请求对方确认。这样,大量数据的传输就会被推迟而且产生了不必要的网络流量交换。 

 

 

TCP协议通信时全双工的:

TCP 协议允许通信双方的应用程序在任何时候都能发送数据。TCP 连接的两端都设有发送缓冲区和接收缓冲区,用来临时存放双向通信的数据。发送数据时,应用程序把数据传送给 TCP 的发送缓冲后,就可以做自己的事情,而 TCP 在合适的时候将数据发送出去。在接收的时候,TCP 把收到的数据放入接收缓冲区,上层应用在合适的时候读取数据。

 

TCP粘包拆包问题:

 

 

为什么会发生 TCP 粘包、拆包

 

  1. 应用程序写入的数据大于套接字缓冲区大小,这将会发生拆包。

  2. 应用程序写入数据小于套接字缓冲区大小,网卡将应用多次写入的数据发送到网络上,这将会发生粘包。

  3. 进行 MSS (最大报文长度)大小的 TCP 分段,当 TCP 报文长度-TCP 头部长度>MSS 的时候将发生拆包。

  4. 接收方法不及时读取套接字缓冲区数据,这将发生粘包。

 

如何处理粘包、拆包

 

通常会有以下一些常用的方法:

 

  1. 使用带消息头的协议、消息头存储消息开始标识及消息长度信息,服务端获取消息头的时候解析出消息长度,然后向后读取该长度的内容。

  2. 设置定长消息,服务端每次读取既定长度的内容作为一条完整消息,当消息不够长时,空位补上固定字符。

  3. 设置消息边界,服务端从网络流中按消息编辑分离出消息内容,一般使用‘\n ’,FTP协议就是这样的。

  4. 更为复杂的协议,例如楼主最近接触比较多的车联网协议 808,809 协议。

 

netty就可以解决上面的问题!等待学习

TCP协议如何保证可靠传输:

一.

自动重传请求 ARQ 协议:它的信道利用率较低

超时重传: 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。

停止等待协议:

1.停止等待协议是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组;

2.在停止等待协议中,若接收方收到重复分组,就丢弃该分组,但同时还要发送确认,表明前一个确认信息,发送方没有收到,如果收到了也不会发送重复分组啊;

当tcp接受端收到包,检验出包出错,丢弃报文段,不给出响应,tcp发送端会超时重传。 

 

连续ARQ协议:不能向发送方反映接收方已经正确收到的所有分组信息

连续 ARQ 协议可提高信道利用率。发送方维持一个发送窗口,凡位于发送窗口内的分组可以连续发送出去,而不需要等待对方确认。接收方一般采用累计确认,对按序到达的最后一个分组发送确认,表明到这个分组为止的所有分组都已经正确收到了。

缺点:不能向发送方反映出接收方已经正确收到的所有分组的信息。 比如:发送方发送了 5条 消息,中间第三条丢失(3号),这时接收方只能对前两个发送确认。发送方无法知道后三个分组的下落,而只好把后三个全部重传一次。这也叫 Go-Back-N(回退 N),表示需要退回来重传已经发送过的 N 个消息(因为只收到了第二条的返回信息,就以为只成功了两条)

 

二.

通过滑动窗口来实现流量控制。

TCP 中采用滑动窗口来进行传输控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。当滑动窗口为 0 时,发送方一般不能再发送数据报,但有两种情况除外,一种情况是可以发送紧急数据,例如,允许用户终止在远端机上的运行进程。另一种情况是发送方可以发送一个 1 字节的数据报来通知接收方重新声明它希望接收的下一字节及发送方的滑动窗口大小。

流量控制是为了控制发送方发送速率,保证接收方来得及接收。

接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。

 

三.

为了进行拥塞控制,TCP 发送方要维持一个 拥塞窗口(cwnd) 的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。

TCP的拥塞控制采用了四种算法,即 慢开始 、 拥塞避免 、快重传 和 快恢复。

慢开始:如果立即开始大量字节注入网络,就会引起网络阻塞,先试探一下,逐渐增大发送窗口,也就是从小到大逐渐增加拥塞窗口的值。

拥塞避免: 拥塞避免算法的思路是让拥塞窗口cwnd缓慢增大,即每经过一个往返时间RTT就把发送方的cwnd加1.

快重传和快恢复:接受方接受到一个不按顺序的数据段,就会立即给发送方发送一个重复请求,发送方连续接受三个重复请求,会认为数据段丢失,会立即重传丢失的数据段。当有单独的数据包丢失时,快速重传和恢复(FRR)能最有效地工作。当有多个数据信息包在某一段很短的时间内丢失时,它则不能很有效地工作。

 

ipv4和ipv6的区别:

ipv44个字节长度32位,ipv616个字节,长度128位

https://blog.csdn.net/chao199512/article/details/86139714

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!