网络协议总结

网络分层

应用层(http协议)、传输控制层(tcp、udp协议)、网络层(ip 路由器)、数据链路层(arp协议 交换机)、物理层
在这里插入图片描述访问流程:
DNS域名解析:浏览器对网址进行解析,获取到域名信息(www.baidu.com),然后拿着域名信息先去浏览器缓存中查询查询域名对应的DNS信息(既该域名对应的ip地址)。如果查询不到,就将域名信息封装成DNS请求报文,交给传输层封装成UDP报文(加上对应端口 号-53),然后再将数据报文交给网络层封装,对报文加上目的IP地址和源IP地址封装成IP协议,通过网络层的arp协议,由目的ip找到对应下一跳的mac地址,再到数据链路层封装成帧,由网卡发送到下一个地址,到达路由器后,路由器根据目的 的mac地址对比发现是发送给自己的就对帧进行拆包,然后获得对应的IP地址,然后根据IP地址查询路由器的arp表,获得下一跳的mac地址,然后再发送出去,知道发送给DNS服务器,然后再经过数据链路层->网络层-传输层拆包获得对应的port信息(53号端口),再到引用层拆包拿到DNS的请求报文;然后查询出该域名对应的IP信息,然后再逐层 装包,发送回去,浏览器拿到对应IP地址,然后换成到浏览器中。
HTTP请求:根据DNS域名解析获得对应的IP信息之后,就将请求信息构造成http报文,加上请求类型(get、post、delete、put)和ip信息,然后将http请求报文交由传输层。传输层将http请求报文通过TCP协议将http报文分割成多个报文段,然后每个报文段加上目的port和源port窗口大小序列号确认号等信息,封装成报文段,再交给网络层,网络层根据arp协议获取IP对应的mac地址,然后将报文封装成数据包,然后交给数据链路层,数据链路层为保证数据可靠传输为数据包添加CRC校验码,然后封装成帧,并添加上目的mac地址和源mac地址,然后通过网卡由物理层传输。
在这里插入图片描述

http请求报文

在这里插入图片描述
主要包含请求行、请求头、请求体三部分

  • 请求行:请求方式、url、版本号
  • 请求头:请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有
    User-Agent:产生请求的浏览器类型。
    Accept:客户端可识别的内容类型列表。
    Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
    Accept-Language: zh-cn
    Accept-Encoding: gzip, deflate
    cookie
  • 请求体:具体数据

http 不同版本变化

  • http0.9:只支持Get请求,只能传输纯文本内容,无状态连接(每次的请求都是独立的,服务器中没有保存客户端的状态)
  • http1.0:任何文件形式都可以被传输,本质上支持长连接,但是默认还是短连接,增加了keep-alive关键字来由短链接变成长连接。
    HTTP的请求和回应格式也发生了变化,除了要传输的数据之外,每次通信都包含头信息,用来描述一些信息。还增加了状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等
  • http1.1:引入了长链接,TCP链接默认是不关闭的可以被多个请求复用
  • http2.0:引入多路复用,在一个连接里面并发处理请求,不像http1.1在一个tcp连接中各个请求是串行的。花销很大

TCP协议

特点:基于连接:数据传输之前要先建立连接
全双工:双向传输
字节流:不限制数据大小,打包成报文段,保证有序接收,重复报文自动丢弃
流量缓存:通过缓存窗口(读写缓存区),解决双方处理能力的不匹配
可靠的传输服务:保证可达,丢包时通过重发机制实现可靠性
拥塞控制:防止网路出现恶性拥塞(根据网络情况控制发送速度和报文段大小)

TCP连接管理

1、TCP连接:四元组[源地址、源端口、目的地址、目的端口]
在这里插入图片描述TCP报文段的主要字段:源地址和目的地之、窗口大小,序列号,确认号,校验和等。
窗口大小:滑动窗口大小
序列号:每次tcp交互都会对序列号+1,用来保证消息的顺序性
确认号:保证消息的可靠性,每次发送报文都要接受一个ack响应,如果报文丢失,就会进行重传
在这里插入图片描述

2、TCP三次握手

  1. 客户端先向服务端发送一个syn请求报文,并在本地开辟部分资源(开辟一个缓存窗口),syn请求中会携带一个client_seq序列号;
  2. 服务端接收到客服端的请求报文后,在本地开辟响应资源(开辟指定大小的缓存窗口),生成一个server_seq序列号,并向客户端发送一个syn请求报文(ack确认号,ack=client_seq+1,和server_seq);
  3. 客户端收到服务端的请求报文,向服务端回复一个ack=server_seq+1确认信息。

为什么是三次连接:因为网络传输中可能存在延迟,B端如果没有A端的ack响应就会回收之前分配的连接资源,防止浪费。
如果是两次连接的话,可能A发送的第一个连接出现拥塞,然后A丢弃的第一次连接,然后又向B发起了一次连接,这时B收到两个连接请求,开辟两份TCP连接资源,但是A端只会响应后一次的连接,所以会浪费部分资源。
在这里插入图片描述

在这里插入图片描述3、TCP四次握手
A端向B端发送一个FIN报文;
B端接收到A端的FIN报文之后,向A发送一个ack响应报文,并且开始回B端收对应资源;
B端回收完对应资源之后,向A端发送一个FIN报文,表示资源回收完毕,可以关闭连接;
A端收到B端的FIN报文后,向B端发送一个ack响应报文,等待2倍MSL时间(报文传播的最长时间)之后,再回收A端对应资源。
在这里插入图片描述第一次挥手:客户端发送一个FIN,用来关闭客户端到服务端的数据传送,客户端进入finwait1状态。

第二次挥手:服务端收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1,服务端进入Close_wait状态。此时TCP连接处于半关闭状态,即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接收。

第三次挥手:服务端发送一个FIN,用来关闭服务端到客户端的数据传送,服务端进入Last_ack状态。

第四次挥手:客户端收到FIN后,客户端进入Time_wait状态,接着发送一个ACK给服务端,确认后,服务端进入Closed状态,完成四次挥手。 客户端等待2倍MSL后关闭连接。

为什么A端最后关闭资源要等待2倍MSL时间?
由于TCP连接是全双工的,要保证两边连接都关闭了。确保ack响应到达。
因为A端最后发送的ack响应可能丢失,丢失之后B端又会重新发送FIN报文;如果A端发送ACK响应之后之间关闭资源,那么如果ack丢失之后,B端就会一直发送FIN报文,导致B端连接一直不中断。

TCP三次握手四次挥手

三次握手:两端A-B通过tcp通信,A先向B端发送一个syn请求报文(第一次握手),B端收到后为这次连接分配响应的资源;然后向A端发送一个syn请求报文和一个ack响应报文(第二次握手);A端收到B端的响应后也想B发送一个ack响应报文,并分配响应的资源(第三次握手)。如此通信建立完成。
在这里插入图片描述

四次挥手:A端要和B端断开连接,A端先向B端发送一个fin报文,表示要和B端断开连接(第一次挥手);B端收到后,向A端发送一个ack报文,表明收到了断开连接的报文,A端收到后进入FIN_WAIT状态(第二次挥手);当B端准备好后,向A端发送fin报文,并关闭资源(第三次握手);A端接收到后,向B端发送ack,表示我已经接收到,并进入等待,如果一段时间B都没有响应,就表明B已经关闭,则A也关闭资源(第四次挥手)。
在这里插入图片描述

TCP滑动窗口

滑动窗口包括两个部分:发送放维护一个发送窗口,接受维护一个接收窗口。滑动窗口的本质就是维护几个变量,然后通过这几个变量将TCP处理的数据分为几类,同时在发送和接受数据时维护这几个变量的变化。
发送窗口
在这里插入图片描述
(1)N是发送窗口的起始字节,也就是说:字节序号 < N的字节都已经发送出去且已经收到ack,确认无误了;

(2)nextSeq就是下一次发送报文的首部Seq字段(Seq即b第一个字节的序号,这些这里不讲了),表示字节序号在 [N,nextSeq)区间的都已经使用过,发送出去了,但是还未收到ack确认;

(3) N+size就是窗口的最后一个可用字节序号,size是发送窗口的大小,就是每次接收到的报文中的Win字段的值,Win字段其实就是对方接收窗口的大小。

如何让维护这几个值呢?

(1)每接收到一个一个报文要做如下事情:检查接收报文的ack,将N 置为 ack,即往前移到ack这个值;读取报文中的Win字段值,即对方的最新接收窗口大小,从而更新N+size的值。

(2)每发送一个报文,就更改nextSeq的值,发送了多少个字节就把nextSeq往前移多少,但是不要超出N+size。
接收窗口
在这里插入图片描述
同样是维护几个关于字节序号的变量,与发送窗口类似,只不过接收窗口的字节序号都是接收到的字节。几个变量的意义如下:

(1)J1表示:字节序号 < J1的字节已经接收到了,即已经发出ack确认了,也可以说可以给程序使用了。程序读取接收缓冲区k个字节,J1会增加k。

(2)J2表示:[J1,J2)区间的字节已经完整、有序的接收到了,但还在缓冲区,没有发出ack进行确认,随时可以供程序读取。

(3)J3就是接收窗口的最后一个可接收字节,由J1+接收窗口的大小算出。超过J3的字节发来是拒绝接收的(一般也不会收到,因为发送窗口的大小是根据接收窗口来的,不可能会超过)。

如何维护呢?

(1)发送一个报文时:将J1的值填入报文首部的ack字段;将 (J3-J2) 的差值填入首部Win字段,告诉对方我还有多 大空间可以接收。

(2)接收到一个报文时,如果报文顺序没出错,则将移动J2,接收到多少字节就移动多少。如果报文按序到达,下一个收到的报文的Seq值就应该等于J2,如果不相等说明中间有报文丢失了,就不移动J2,从 而接下来发送的报文ack一直是同一个:J2,也就是重复确认,相应的又有快重传

滑动窗口原理总结

因为窗口的起始值在开始后就会慢慢的增加,也就是右移,所以这也是滑动窗口名字的由来。实际上就是在接收报文、发送报文维护几个关于ack 、字节序号、seq(报文起始字节序号)的变量值。关于ack、seq、WinSize总结如下:

  1. 发送报文ack是怎么来的,接收到报文时ack又是怎么用的:
    发送报文时从接收窗口拿J2的值填到报文首部的 ack;接收报文时拿到ack后将发送窗口的起始值N更新为ack。

  2. 发送报文seq是怎么来的,接收到报文时seq又是怎么用的:
    发送报文时从发送窗口拿到nextSeq的值填到报文首部的seq字段;接收到报文后查看报文的seq字段是否是接收窗口的J2,是就将J2连续右移报文长度个单位。

  3. 发送报文Win是怎么来的,接收到报文时Win又是怎么用的:
    发送报文时,从接收窗口拿到 (J3-J2)的这个差值填到首部的Win字段;接收到报文时拿到首部的Win字段的值,假设为size,则更新发送窗口的结束位置为 N+size

网络通信流程

java将数据以一定形式封装(http协议,应用层),然后调用socket(套字节 ip:port——ip:port)发送数据到指定ip:port(数据到达传输控制层);根据目的地址的ip查询路由表,将目的地址ip&掩码,找到对应的下一跳地址(网管),到这里数据到达网络层;根据网管地址通过arp协议查询arp表,找到网管对应网卡的mac地址,数据到达数据链路层;通过物理层传输到对应下一跳的位置,拆包,找到数据包中的目的ip,再次查找路由表找到下一跳的网管,再查找arp表找到对应网管的mac地址,装包再发送;如此装包拆包就发送到了目的地址。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值