必备网络基础知识(持续补充)
网络基础知识
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通信流程