必备网络基础知识(持续补充)

网络基础知识

OSI七层参考模型

数据发送接收过程:先自上而下,后自下而上

每一层的功能以及实现的协议

TCP/IP数据处理流程:先自上而下,再自下而上处理头部

TCP(传输控制协议)简介

  • 面向连接的、可靠的、基于字节流的传输层通讯协议
  • 将应用层的数据流分割成报文段并发送给目标节点的TCP层
  • 数据包都有序号,对方收到则发送ACK确认
  • 使用校验和函数来检验数据在传输过程中是否有误

TCP报文头

1、端口号:用来标识同一台计算机的不同的应用进程。

(1)源端口:源端口和IP地址的作用是标识报文的返回地址。

(2)目的端口:端口指明接收方计算机上的应用程序接口。

TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。

2、序号和确认号:是TCP可靠传输的关键部分。序号是本报文段发送的数据组的第一个字节的序号。在TCP传送的流中,每一个字节一个序号。e.g.一个报文段的序号为300,此报文段数据部分共有100字节,则下一个报文段的序号为400。所以序号确保了TCP传输的有序性。确认号,即ACK,指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。确认号只有当ACK标志为1时才有效。比如建立连接时,SYN报文的ACK标志位为0。

3、数据偏移/首部长度:4bits。由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任何任选字段则长度为20字节,4位首部长度字段所能表示的最大值为1111,转化为10进制为15,15*32/8 = 60,故报头最大长度为60字节。首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中的起始偏移值。

4、保留:为将来定义新的用途保留,现在一般置0。

5、TCP Flags:URG  ACK  PSH  RST  SYN  FIN,共6个,每一个标志位表示一个控制功能。

URG:紧急指针标志,为1时表示紧急指针有效,为0则忽略紧急指针。

ACK:确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。

PSH:push标志,为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。

RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。

SYN:同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。

FIN:finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。

6、窗口:滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小时一个16bit字段,因而窗口大小最大为65535。

7、校验和:奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证。

8、紧急指针:只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。

9、选项和填充:最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。

10、数据部分 TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。

TCP三次握手

 

 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接.

第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认; 
第二次握手:服务器收到syn包,必须确认客户端的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RCVD状态; 
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手.

SYC超时原因以及解决措施?

Client出现故障怎么办?

TCP四次挥手

MSL:最长报文段寿命,30s(linux)

第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。

为什么要有TIEM-WAIT状态?

为什么需要四次挥手才断开连接?

UDP报文结构

UDP特点

  • 面向非连接
  • 不维护连接状态,支持同时向多个客户端传输相同的消息
  • 数据包报文只有8个字节,额外开销较小
  • 吞吐量只受限于数据生成速率、传输速率以及机器性能
  • 尽最大努力交付,不保证可靠交付,不需要维持复杂的链路状态表
  • 面向报文,不对应用程序提交的报文信息进行拆分或者合并

TCP和UDP区别

TCP:面向连接,可靠性,有序性,重量级

UDP:无连接,速度快,轻量级

TCP的滑动窗口

TCP使用滑动窗口做流量控制与乱序重排

  • 保证TCP的可靠性(源于确认重传机制)
  • 保证TCP的流控特性

窗口数据计算过程

  • 发送端:LastByteAcked表示已发送,已收到ACK,LastByteSent表示已发送,未收到ACK,LastByteWritten指向上层应用正在写的位置。

 

  • 接收端:LastByteRead指向上层应用读完的最后一个字节的位置,NextByteExpected指向的收到的连续包的最后一个位置,LastByteRcved指向的是已收到的最后一个字节的位置,我们可以看到中间有些数据还没有到达,所以有数据空白区。
  • 接收端在给发送端回ACK中会汇报自己的AdvertisedWindow = MaxRcvBuffer – (LastByteRcvd – LastByteRead)。
  • 而发送方会根据这个窗口来控制剩余可发送数据的大小,以保证接收方可以处理,计算方式:EffectiveWindow = AdvertisedWindow - (LastByteSent– LastByteAcked)。

TCP会话发送方

发送方的发送缓存内的数据都可以被分为4类:

1. 已发送,已收到ACK
2. 已发送,未收到ACK
3. 未发送,但允许发送
4. 未发送,但不允许发送

其中类型2和3都属于发送窗口。

TCP发送方滑动原理

当收到接收方对新的ACK对于发送窗口后续字节的确认时,窗口就会进行滑动,前提是还有未发送,但运行发送的数据以及是连续确认之后。

如果32没有被确认,而34被确认了,窗口也不会向右滑动,只有等到32到34都被确认了之后,以及连续被确认之后,滑动窗口才会移动,那在此时没有被移动之前,大于51的数据以及窗口外的数据是不能被发送的。

如果从32到35都被确认了,则滑动窗口,回向又移动四位,到36这个位置,进而我们的程序就能够发送52到55的数据了。

TCP会话接收方

接收方的缓存数据分为3类:
1. 已接收
2. 未接收但准备接收
3. 未接收而且不准备接收

其中类型2属于接收窗口。

HTTP(超文本传输协议)特点(补充)

  • 支持客户/服务器模式
  • 简单快速
  • 灵活
  • 无连接
  • 无状态

HTTP请求结构

HTTP响应结构

HTTP请求/响应步骤(补充)

  • 客户端连接到Web服务器
  • 发送HTTP请求
  • 服务器接收请求并返回HTTP响应
  • 释放TCP连接
  • 客户端浏览器解析HTML内容

在浏览器输入URL,按下回车之后经历的流程(补充)

  • DNS解析
  • TCP连接
  • 发送HTTP请求
  • 服务器处理请求并返回HTTP报文
  • 浏览器解析渲染页面
  • 连接结束

HTTP状态码

状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:

  • 1xx:指示信息--表示请求已接收,继续处理
  • 2xx:成功--表示请求已被成功接收、理解、接受
  • 3xx:重定向--要完成请求必须进行更进一步的操作
  • 4xx:客户端错误--请求有语法错误或请求无法实现
  • 5xx:服务器端错误--服务器未能实现合法的请求

常见状态码

  • 200 OK :正常返回信息
  • 400 Bad Request:客户端请求有语法错误,不能被服务器所理解
  • 401 Unauthorized :请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 
  • 403 Forbidden:服务器收到请求,但是拒绝提供服务
  • 404 Not Found:请求资源不存在,eg:输入了错误的URL
  • 500 Internal Server Error:服务器发生不可预期的错误
  • 503 Server Unavailable :服务器当前不能处理客户端的请求,一段时间后可能恢复正常

GET和POST请求区别

  • HTTP报文层面:GET将请求信息放在URL,POST在报文体中
  • 数据库层面:GET符合幂等性和安全性,POST不符合(幂等性:对数据库的多次操作获得结果一致;安全性:不会改变数据库原有数据)
  • 其他层面:GET可以被缓存、被存储,而POST不行

Cookie简介

  • 是由服务器发给客户端的特殊信息,以文本的形式存放在客户端
  • 客户端再次请求的时候,会把Cookie回发
  • 服务器收到后,会解析Cookie生成与客户端相对应的内容

Cookie的设置以及发送过程

Session简介

  • 服务器端的机制,在服务器上保存的信息
  • 解析客户端请求并操作jsession id,按需保存状态信息

Session的实现方式

  • 使用Cookie来实现(Cookie头中携带jessionid)
  • 使用URL回写来实现(链接携带jessionid)

Cookie和Session区别

  • Cookie数据存放在客户的浏览器上,Session数据放在服务器上
  • Seesion相对于Cookie更安全(可以分析存放在本地的Cookie并进行欺骗)
  • 若考虑减轻服务器负担,应当使用Cookie

HTTPS简介

SSL(安全套接层协议)

  • 为网络通信提供安全及数据完整性的一种安全协议
  • 是操作系统对外的API,SSL3.0后更名为TLS
  • 采用身份验证和数据加密保证网络通信的安全和数据的完整性

HTTPS数据传输流程(补充)

  • 浏览器将支持的加密算法信息发给服务器
  • 服务器选择一套浏览器支持的加密算法,以证书的形式回发浏览器
  • 浏览器验证证书合法性,并结合证书公钥加密信息发给服务器
  • 服务器使用私钥解密信息,验证哈希,加密响应信息回发浏览器
  • 浏览器解密响应信息,并对消息进行验真,之后进行加密交互数据

HTTP和HTTPS区别

  • HTTPS需要到CA申请证书,HTTP不需要
  • HTTPS密文传输,HTTP明文传输
  • 连接方式不同,HTTPS默认使用443端口,HTTP使用80端口
  • HTTPS=HTTP+加密+认证+完整性保护,较HTTP安全

HTTPS真的很安全吗?

  • 浏览器默认填充http://,请求需要进行跳转,有被劫持的风险
  • 可以使用HSTS优化

Socket简介

Socket是对TCP/IP协议的抽象,是操作系统对外开放的接口

Socket通信流程

posted @ 2020-06-26 20:18  程序员Forlan  阅读(344)  评论(0编辑  收藏  举报