计算机网络各层相关协议
OSI的体系结构:
具体协议
ARP协议:
数据在传输的过程中,有不断封装过程,到了链路层的话(以太网传输),在以太网的帧格式中会出现目的主机的MAC地址,但是我们从一开始就只知道目的主机的IP地址,所以这里用到了ARP协议(简单来说就是寻找对应 目标的MAC地址)
源主机先在自己的ARP缓冲区中寻找映射,如果有(直接填充于以太网帧中),如果没有,通过路由广播请求,这时一些联网的主机就会收到这个请求,并将这个请求传回网络层,对比IP地址,检验是否可以接受,如果不行,则直接丢失这个信息,如果可以那么回复ARP请求(回复里面包含目的主机的MAC地址,应答是单播方式),并且将源主机的MAC地址加入到目的ARP缓冲区中,形成映射,源主机接受到请求后,将目的的MAC地址加入到ARP缓冲区,也形成映射。
RARP协议:
mac地址将mac地址解析为ip地址
TCP/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协议(点对点协议):提供连接认证、传输加密以及压缩。
物理层:
实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。
IP数据包在各网络层间传输的大小分析:
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函数时,数据长度参数不受限制。而实际上,所指定的这段数据并不一定会一次性发送出去,如果这段数据比较长,会被分段发送,如果比较短,可能会等待和下一次数据一起发送。
本文来自博客园,作者:LeeJuly,转载请注明原文链接:https://www.cnblogs.com/peterleee/p/10611981.html