最后更新:2022-03-01 02:17:16 手机定位技术交流文章
计算机网络体系可以大致分为一下三种,OSI七层模型、TCP/IP四层模型和五层模型。

TCP/IP五层模型:应用层、传输层、网络层、数据链路层、物理层:
向主机进程提供通用的数据传输服务
。该层主要有以下两种协议:将网络层传下来的IP数据包组装成帧
,并再相邻节点的链路上传送帧。用户数据报协议 UDP(User Datagram Protocol)
支持一对一、一对多、多对一和多对多的交互通信
。传输控制协议 TCP(Transmission Control Protocol)
提供全双工通信
,面向字节流(把应用层传下来的报文看成字节流,把字节流组织成大小不等的数据块),每一条 TCP 连接只能是
点对点的(一对一)
。TCP 用于在传输层有必要实现可靠传输的情况,UDP 用于对高速传输和实时性有较高要求的通信。TCP和 UDP 应该根据应用目的按需使用。
TCP 是面向连接,能保证数据的可靠性交付,因此经常用于:
UDP 面向无连接,它可以随时发送数据,再加上UDP本身的处理既简单又高效,因此经常用于:

TCP主要提供了
检验和、序列号/确认应答、超时重传、滑动窗口、拥塞控制 和 流量控制
等方法实现了可靠性传输。
在进行数据传输时,如果传输的数据比较大,就需要拆分为多个数据包进行发送。
TCP 协议需要对数据进行确认后,才可以发送下一个数据包。这样一来,就会在等待确认应答包环节浪费时间。
为了避免这种情况,TCP引入了窗口概念。
窗口大小指的是不需要等待确认应答包而可以继续发送数据包的最大值。

从上面的图可以看到滑动窗口左边的是已发送并且被确认的分组,滑动窗口右边是还没有轮到的分组。
滑动窗口里面也分为两块,一块是已经发送但是未被确认的分组,另一块是窗口内等待发送的分组。随着已发送的分组不断被确认,窗口内等待发送的分组也会不断被发送。整个窗口就会往右移动,让还没轮到的分组进入窗口内。
可以看到滑动窗口起到了一个
限流
的作用,也就是说当前滑动窗口的大小决定了当前 TCP 发送包的速率,而
滑动窗口的大小取决于拥塞控制窗口和流量控制窗口的两者间的最小值。
TCP 一共使用了四种算法来实现拥塞控制:
重要字段
序号(sequence number):
seq序号
,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
确认号(acknowledgement number):
ack序号
,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。
标志位(Flags):共6个,即URG、ACK、PSH、RST、SYN、FIN等。具体含义如下:
ACK:确认序号有效。(区分确认号ack)
SYN:发起一个新连接。
FIN:释放一个连接。
那么这些字段有什么作用呢?
seq序号、ack序号:用于确认数据是否准确,是否正常通信。
标志位:用于确认/更改连接状态。

在这里插入代码片作为初始序列号,此时服务器进入SYN_RECV状态。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。
防止已过期的连接请求报文突然又传送到服务器,因而产生错误和资源浪费。
三次握手才能让双方均确认自己和对方的发送和接收能力都正常。
告知对方自己的初始序号值,并确认收到对方的初始序号值。
维护了序号字段和确认序号字段
,通过因为三次握手已经可以确认
也就无需再第四次握手了。

连接释放报文(FIN=1)
,
主动关闭连接,同时等待服务端的确认。
确认报文(ACK=1)
,序列号 seq = k,确认号 ack = m + 1。连接释放报文(FIN=1,ACK=1)
,主动关闭连接,同时等待 A的确认。客户端就进入了 TIME-WAIT 状态
。注意此时客户端到 TCP 连接还没有释放,必须经过
2*MSL(最长报文段寿命)
的时间后,才进入 CLOSED 状态。而服务端只要收到客户端发出的确认,就立即进入 CLOSED 状态。可以看到,服务端结束 TCP 连接的时间要比客户端早一些。服务器在收到客户端的 FIN 报文段后,可能还有一些数据要传输,所以不能马上关闭连接,但是会做出应答,返回 ACK 报文段.接下来可能会继续发送数据,在数据发送完后,服务器会向客户单发送 FIN 报文,表示数据已经发送完毕,请求关闭连接。
服务器的ACK和FIN一般都会分开发送,从而导致多了一次,因此一共需要四次挥手。
确保 ACK 报文能够到达服务端,从而使服务端正常关闭连接。
报文段在网络上存活的最长时间
。客户端等待 2MSL 时间,即「客户端 ACK 报文 1MSL 超时 + 服务端 FIN 报文 1MSL 传输」,就能够收到服务端
重传的 FIN/ACK 报文
,然后客户端重传一次 ACK 报文,
并重新启动 2MSL 计时器
。如此保证服务端能够正常关闭。防止已失效的连接请求报文段出现在之后的连接中。
TCP 要求在 2MSL 内不使用相同的序列号
。客户端在发送完最后一个 ACK 报文段后,再经过时间2MSL,就可以
保证本连接持续的时间内产生的所有报文段都从网络中消失
。这样就可以使下一个连接中不会出现这种旧的连接请求报文段。或者即使收到这些过时的报文,也可以不处理它。或者说,如果三次握手阶段、四次挥手阶段的包丢失了怎么办?如“服务端重发 FIN丢失”的问题。
简而言之,通过
定时器 + 超时重试机制
,尝试获取确认,直到最后会自动断开连接。
具体而言,TCP 设有一个
保活计时器
。
服务器每收到一次客户端的数据,都会重新复位这个计时器,时间通常是设置为 2 小时
。若 2 小时还没有收到客户端的任何数据,服务器就开始重试:
每隔 75 分钟
发送一个探测报文段,若一连发送
10 个
探测报文后客户端依然没有回应,那么服务器就认为连接已经断开了。
从服务器来讲
,短时间内关闭了大量的Client连接,就会造成服务器上
出现大量的TIME_WAIT连接
,严重消耗着服务器的资源,此时部分客户端就会显示连接不上。
从客户端来讲
,客户端TIME_WAIT过多,就会
导致端口资源被占用
,因为端口就65536个,被占满就会导致无法创建新的连接。
解决办法:服务器可以设置
SO_REUSEADDR 套接字
选项来避免 TIME_WAIT状态,此套接字选项告诉内核,
即使此端口正忙(处于TIME_WAIT状态),也请继续并重用它。
TIME_WAIT 是主动断开连接的一方会进入的状态
,一般情况下,都是客户端所处的状态;服务器端一般设置不主动关闭连接。
任意类型
的数据。传输的类型由
Content-Type
加以标记。无状态
。对于客户端每次发送的请求,服务器都认为是一个新的请求,上一次会话和下一次会话之间没有联系。HTTP请求由
请求行、请求头部、空行和请求体
四个部分组成。
请求行
:包括请求方法,访问的资源URL,使用的HTTP版本。
GET和POST
是最常见的HTTP方法,除此以外还包括
DELETE、HEAD、OPTIONS、PUT、TRACE
。请求头
:格式为“属性名:属性值”,服务端根据请求头获取客户端的信息,主要有**cookie、host、connection、accept-language、accept-encoding、user-agent** 。请求体
:用户的请求数据如用户名,密码等。请求报文示例:
HTTP响应也由四个部分组成,分别是:
状态行、响应头、空行和响应体
。
connection、content-type、content-encoding、content-length、set-cookie、Last-Modified,、Cache-Control、Expires
。413:请求体过大
在
HTTP/1.0
中,默认使用的是
短连接
。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。
但从
HTTP/1.1
起,默认使用
长连接
,用以保持连接特性。使用长连接的HTTP协议,会在响应头有加入这行代码:
Connection:keep-alive
长连接
:复用TCP连接,允许客户端通过同一连接发送多个请求
。断点续传
:HTTP1.0 不支持断点续传。HTTP1.1 新增了 range 字段,用来指定数据字节位置,支持断点续传。错误通知的管理
:在HTTP1.1中新增了24个错误状态响应码Host头处理
:在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名。到了HTTP1.1时代,虚拟主机技术发展迅速,在一台物理服务器上可以存在多个虚拟主机,并且它们共享一个IP地址,故HTTP1.1增加了HOST信息。HTTP2.0相比HTTP1.1支持的特性:
新的二进制格式
:HTTP1.1 基于文本格式传输数据;
HTTP2.0采用二进制格式传输数据
,解析更高效。多路复用
:在一个连接里,允许同时发送多个请求或响应,并且这些请求或响应能够
并行的传输而不被阻塞
,
避免 HTTP1.1 出现的”队头堵塞”问题
。头部压缩
:既避免了重复header的传输,又减小了需要传输的大小
。服务端推送
:HTTP2.0允许服务器向客户端推送资源,无需客户端发送请求到服务器获取。超文本传输协议
,信息是
明文传输
;HTTPS则**是具有安全性的ssl加密传输协议。**首选 dns 服务器
,
即本地 dns 服务器
(递归查询),本地域名服务器查询自己的dns缓存,如果没有,则进行迭代查询。
将本地dns服务器将IP返回给操作系统,同时缓存IP
。发起 tcp 的三次握手
,建立 tcp 连接。使用上的区别
本质区别
GET请求是幂等性的
,POST请求不是。这个是它们本质区别。指一次和多次请求某一个资源应该具有同样的副作用
。简单来说意味着
对同一URL的多个请求应该返回同样的结果
。什么是 Cookie
服务器发送到用户浏览器并保存在本地的一小块数据
什么是 Session
用户第一次请求服务器的时候,服务器根据用户提交的相关信息,创建对应的 Session ,请求返回时将此 Session 的唯一标识信息 SessionID 返回给浏览器,浏览器接收到服务器返回的 SessionID 信息后,会将此信息存入到 Cookie 中,同时 Cookie 记录此 SessionID 属于哪个域名。
当用户第二次访问服务器的时候,请求会自动判断此域名下是否存在 Cookie 信息,如果存在自动将Cookie 信息也发送给服务端,服务端会从 Cookie 中获取 SessionID,再根据 SessionID 查找对应的Session 信息,如果没有找到说明用户没有登录或者登录失效,如果找到 Session 证明用户已经登录可执行后面操作。
根据以上流程可知,
SessionID 是连接 Cookie 和 Session 的一道桥梁
,大部分系统也是根据此原理来验证用户登录状态。
本文由 在线网速测试 整理编辑,转载请注明出处。