协议随便写写

前言

有人让我写一篇 http 的博客,但 http 只是应用层协议的一支而已,单独写它没什么意义,其实我们在大学的时候就已经学过了 OSI 七层协议,只是大多数人没有特别关注罢了,现在面试比较多的都是问 tcp 协议的三次握手。

协议简介

不要觉得协议就很高大上,其实在进行 web 开发时,定义给前端的接口文档,就是协议,一般为 JSON 数据,只不过 tcp 协议是以 bit 为单位做字段的,这样可以尽可能减少数据大小,如果是做硬件端的,则会更加清楚,因为厂家给过来一般是利用到了每一 bit

OSI 七层协议

标准的七层协议自底向上分为:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层

物理层:网线、路由器、设备也可以说终端,这上面传的是比特

数据链路层:网卡或网络模块,格式化数据以进行传输,提供错误检测与纠正功能

网络层:用于确定当前的消息是传输给网络上的哪一台主机,使用的是 ARP 协议,IP 协议用于定义网络地址划分。

传输层:定义了一些传输协议,如可靠传输 TCP ,不可靠传输 UDP ,这里会将数据分段,到达目的地后再进行重组

会话层,表示层和应用层现在是合为一层应用层,常用的应用层协议有 http、dns,ftp,ssh,telnet,pop3,smtp 等,http 其实是建立在 tcp 协议的基础上的,以前还有一个 soap 协议,其实它是在 http 协议的 body 中做了下文章,用于 webservice 接口,现在用得少了。

所以我访问某个网站是怎么走的呢,首先将域名转换成 ip 地址使用 dns 协议,请求是走 http 协议, http 协议是建立在 tcp 协议的基础上的,然后你的消息经过 tcp 协议的包装,进入网络层,网络层根据 arp 协议查询你的数据要发到链路上的哪一台机器,然后经过网卡,将你的数据格式为电流信息,然后在物理层网线上传输;到达后,经过网卡进行数据还原,然后网络层接收你的信息,用 rarp 协议还原成 ip 信息,经过 tcp 协议脱壳拿出body 中的 http 协议内容,然后再经过应用解析,再拿出 http 协议中 body 内容,最终到达应用去处理。

TCP/IP 协议

上学的时候书上应该有说过 tcp/ip 协议,它是对利用 ip 通信用到的协议群的统称,因为 tcp 和 ip 是核心,所以叫 tcp/ip 协议。

所以,各层都有一些什么协议呢


协议
应用层
DHCP · DNS · FTP · Gopher · HTTP · IMAP4 · IRC · NNTP · XMPP · POP3 · SIP · SMTP ·SNMP · SSH · TELNET · RPC · RTCP · RTP ·RTSP · SDP · SOAP · GTP · STUN · NTP · SSDP
表示层
HTTP/HTML · FTP · Telnet · ASN.1(具有表示层功能)
会话层
ADSP·ASP·H.245·ISO-SP·iSNS·NetBIOS·PAP·RPC·RTCP·SMPP·SCP·SSH·ZIP·SDP(具有会话层功能)
传输层
TCP · UDP · TLS · DCCP · SCTP ·RSVP · PPTP
网络层
IP (IPv4 · IPv6) · ICMP · ICMPv6 · IGMP ·IS-IS · IPsec · BGP · RIP · OSPF ·ARP · RARP
数据链路层 Wi-Fi(IEEE 802.11) · WiMAX(IEEE 802.16) ·ATM · DTM · 令牌环 · 以太网路 ·FDDI · 帧中继 · GPRS · EVDO · HSPA · HDLC · PPP · L2TP · ISDN ·STP
物理层
以太网路卡 · 调制解调器 · 电力线通信(PLC) · SONET/SDH(光同步数字传输网) ·G.709(光传输网络) · 光导纤维 · 同轴电缆 · 双绞线

下面详细说下几种常用的协议

常用的协议有:应用层 http,soap,ssh,dns 域名系统,pop3 smtp 用于邮件的协议,ftp 文件传输协议;传输层 tcp ,udp ;网络层 arp/rarp ,ip 协议;数据链路层 wifi,2G,3G,4G,5G等

arp/rarp 协议

地址解析协议和逆地址解析协议,用于把 ip 地址和 mac 地址的相互映射。 发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址,收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。

ARP 协议与 ARP 欺骗

dns 域名协议

这也是一个映射协议,将域名映射到 ip 地址,基于 UDP 协议,dns 需要解析,第一个解析它的是本机的 hosts 文件,然后才是由域名服务器进行解析,这也是一些破解软件将一些地址映射到 0.0.0.0 可以破解的原因。

一个URL 的地址部分由点进行分隔,从后往前数分别是顶级域名,二级域名 ,三级域名,每个域名是可以重复的,所以域名系统整体看起来就是颗树状图,这些域名会由域名服务器解析,详细解析过程看这篇文章

https://blog.csdn.net/u010331428/article/details/78189195

http 协议 *

学这个协议建议安装 postman 工具,和使用 IDEA 的 rest-client 工具

http 协议应该说是 web 开发中用得最多的,全称为超文本传输协议,这个协议不需要专门的抓包工具,使用浏览器的网络面板就可以清晰的看到,一般它的请求格式是这样子的

img

请求方法有:GET,POST,PUT,DELETE,OPTIONS 等请求方法,但用得比较多的还是 GET 和 POST ,下面只讨论 GET 和 POST

其中请求体是我们可以自定义的部分,在请求头中有一个专门的属性来描述它是什么格式的数据 Content-Type

只有 POST 请求才能有请求体,也即只有 POST 请求才有 Content-Type ,GET 请求是没有的

GET 请求通过在 URL 后面拼接 keyValue 来向服务端传递查询参数,这个参数可以通过 request.getParameter(key) 来获取 ,在 springmvc 中可以直接写在参数或使用 @RequestParam 进行接收

POST 请求一般是将数据放在请求体中,使用不同的 content-Type 来描述请求体中的数据,常用的 Content-Type 有 application/x-www-form-urlencoded application/json application/xml multipart/form-data ,当使用 application/json 或者 application/xml 时,在 springmvc 中需要使用 @RequestBody 接收,在 servlet 中使用 request.getInputStream 读流来获取数据

当需要传输文件时,使用 multipart/form-data 格式,可以把数据以多种格式进行传输,每一部分可以对应不同的格式,详细格式见 rest-client 工具

http 短连接和长连接:http1.1 规定了 http 默认保持长连接,由参数 connection:keep-alive 和 keep-alive:timeout=20 时长来控制 ,这个长连接是说建立的 tcp 是一直连接的,在 http1.0 时代是建立一个 tcp 连接,发起一次请求和响应,然后就断开 tcp 连接了,但这样太浪费资源了。

http 是一种无状态的协议,即不会保存上一次请求和信息,如果需要登录,需要每次都登录凭证带上,这个登录凭证使用的是 cookies ,但现在应用一般都是多实例应用,或者分布式的,登录的用户信息不会保存在一台服务中,需要所有用户共享,解决方案有 session-redis,单点登录应用,最好用的应该还是属 jwts ,使用算法来验证一个用户信息。

webservice 的 soap 协议是建立在 http 协议上的,它把请求体的格式定义了一下,使用 xml ,并且有固定的格式,这种格式是自描述的,但现在已经用得不多了,因为太笨重了。

tcp 协议

img

tcp 协议面试问得最多的就是三次握手和四次挥手了,这个看书上的解释能把头绕晕,基本本来就一件很简单的事

假设打电话时信号不好,模拟信道,A:你听得到吗?,B:我听得到,你听到到吗?,A:我听得到;挂电话时,A:我要挂电话了,已中断数据,B:我知道了,我还有话还没说完你等会,B:说完了,你全听到了吗,A:知道了。

但实际上不会像上面说的那样简单,因为 tcp 会将数据分片,不可能一次性把所有数据传过去的,这其中的难度读者可以去做一文件分片上传就知道了,接收方可能收到的 tcp 分片可能并不是顺序的,还有可能丢失,所以要把每一次传输标记序号,并且还有一个 ack 确认。

对于三次握手和四次挥手的详细流程读者可以翻看大学的书本或参考TCP的三次握手与四次挥手理解及面试题

对于丢包,TCP 有两种方式来处理丢包问题,详情见 TCP 是如何解决丢包问题的

上面这些怎么验证呢,读者可以通过 wireshark 去抓一次 http 的包就可以看到了,因为 http 连接建立前首先要建立 tcp ,如果是网络环境不好的情况下,将会出现大量的 out-of-order 和 retransmission

ip 协议

只讨论 ipv4 ,在 ip 协议中,使用 32 位来对地址进行编码,ip 地址由两部分来组成 ,网络号和主机号,网络号标识的是Internet上的一个子网,而主机号标识的是子网中的某台主机。网络地址分解成两个域后,带来了一个重要的优点:IP数据包从网际上的一个网络到达另一个网络时,选择路径可以基于网络而不是主机。在大型的网际中,这一点优势特别明显,因为路由表中只存储网络信息而不是主机信息,这样可以大大简化路由表。IP地址根据网络号和主机号的数量而分为A、B、C三类:

A类IP地址:用7位(bit)来标识网络号,24位标识主机号,最前面一位为"0",即A类地址的第一段取值介于1~126之间。A类地址通常为大型网络而提供,全世界总共只有126个只可能的A类网络,每个A类网络最多可以连接16777214台主机。

B类IP地址:用14位来标识网络号,16位标识主机号,前面两位是"10"。B类地址的第一段取值介于128~191之间,第一段和第二段合在一起表示网络号。B类地址适用于中等规模的网络,全世界大约有16000个B类网络,每个B类网络最多可以连接65534台主机。

C类IP地址:用21位来标识网络号,8位标识主机号,前面三位是"110"。C类地址的第一段取值介于192~223之间,第一段、第二段、第三段合在一起表示网络号。最后一段标识网络上的主机号。C类地址适用于校园网等小型网络,每个C类网络最多可以有254台主机。

所以我们看一个 ip 地址是哪一类时,只需要看第一段是在哪个范围中,比如常见的 192.x.x.x 就是 C 类 Ip 地址。

那子网又是什么呢,我们经常在配置网络的时候需要配置子网掩码,子网是为了划分出更小的网络,如在一个公司有 A,B 两个部门,如果运维想划分成两个子网的话也是可以的,但一般不会这么干,因为这样两个部门的主机之间不能直接连通了,并且这个子网会占用主机号的位置,使可以配置的主机数更少了。例如 ,配置了一个C 类地址,只允许 254 台主机,如果再使用子网,每个部门就只能 127 台主机,如果B 部门有 200 个人,而 A 部门有 53 个人就配置不了。

子网掩码是这样的规则,我们先得看这个地址是A类还是B类还是 C 类,然后判断主机号的位置,然后掩码在本来主机位的位置占用为 1,不占用为 0 ,代表不同的子网,例如常见的设置 255.255.255.0 在 C 类地址中就是没有设置子网,允许 254 台主机。

你可能注意到了,C 类地址中 2 的 8 次方应该是 256 台主机,但为什么只有 254 台呢,因为地址全 0 和全 1 有不同的意义 ,主机位全为 0 时表示子网地址,全为 1 时表示广播地址。

经常看到这种写法:192.168.1.0/24 这个 24 表示的就是前 24 位是网络号,从 192 可以看出是一个 C 类 ip 地址

变长掩码 ,前面A,B 部门说了,存在主机数分配不均的情况,这时就需要变长掩码,这属于运维的知识了,就不详细说明了

我的博文大纲:https://blog.csdn.net/sanri1993/article/details/52201255

猜你喜欢

转载自blog.csdn.net/sanri1993/article/details/104419509