欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

计算机网络方面的基础知识

程序员文章站 2022-07-01 17:26:34
...

计算机网络相关知识

1.网络基础知识

OSI七层架构(概念性结构):

第一层:物理层,主要定义物理设备的标准(如网络、光纤的接口类型,各种传输介质的传输速率等等);主要作用是传输比特流,具体过程是,设备A将 0 1 转化为电流强弱来进行传输,到达目的地之后转化为 0 1,即模数转换和数模转换;这一层的数据叫做比特(网卡就是在这一层)。

在传输比特流的过程中,可能会出现错传、或者数据传输不完整;因此数据链路层应运而生.

第二层:数据链路层,主要是将从物理层接收的数据进行**MAC地址(网卡地址)**的封装和解封,定义了如何格式化数据以进行传输,以及如何控制对物理介质的访问,这一层通常还提供错误检测和纠正以确保数据传输的可靠性;将比特数据组成了帧,(交换机工作在这一层)对帧解码,并根据帧中的信息把数据发送到正确的接收方。

随着网络节点的增加,点对点通信的时候,是需要经过多个节点的,那么如何找到目标节点、如何选择最优路线成为了首要需求;此时,便有了网络层。

第三层:网络层,主要将从下一层接受的数据进行IP地址的封装和解封;主要作用是将网络地址翻译成对应的物理地址,并决定如何将数据从发送方路由到接收方,网络层通过综合考虑(发送优先权、网络拥塞程度、服务质量、以及可选路由的花费)来决定从一个网络中节点A到另一个网络中节点B的最佳路径;由于网络层处理并智能指导路由器连接网络各段,(路由器属于网络层)这一层工作的数据叫做数据包。

随着网络通信协议的进一步扩大,通信过程中需要传输大量的数据,如海量文件传输等,需要很长的时间,而网络在通信的过程中,会中断很多次,此时,为了保证传输大量文件时的准确性,需要对发送出的数据进行切分,切割为一个一个的段落,即segment进行发送,那么其中一个段落丢失了怎么办,要不要重传,每个段落要按照顺利到达吗,这就是传输层要考虑的问题。

第四层:传输层,定义了传输数据的协议和端口号(TCP/UDP),解决了主机间的数据传输,数据间的传输可以是不同网络的,并且传输层解决了传输质量的问题,该层称之为OSI模型中最重要的一层。传输协议、同时进行流量控制,或是基于接收方可收受数据的快慢程度,规定适当的发送速率,除此之外,传输层按照网络能处理的最大尺寸,将较长的数据包进行强制分割,例如,以太网无法接受大于1500字节的数据包,发送发节点的传输层,将数据分割成较小的数据片,并且每一数据片安排序号,以便数据到达接收方地传输层时是能以正确的顺序重组,该过程称为排序;该过程中需要我们关注的是TCP/IP协议中的TCP协议和UDP协议。这一层的数据叫做段。

现在,我们已经保证给正确的计算机发送正确的封装过后的信息了,但是用户体验好不好,难道每次都有调用TCP协议去打包,然后调用IP协议去找路由,自己去发,当然不行,所以我们要建立一个自动收发包、自动寻址的功能,于是有了会话层。

第五层:会话层,主要是在系统之间发起会话或者接受会话,主要作用是建立和管理应用程序之间的通信,现在能保证应用程序自动收发包和寻址了;

但如果要用Linux给Windows发包,两个系统语法不一致,就像安装包exe是不能再Linux上面执行的,于是需要表示层。

第六层:表示层,主要是对接收到的数据进行解释、加密解密、压缩解压缩等(即把计算机能够识别的东西转换成人能够识别的东西,如图片、声音等),帮我们解决不同系统之间通信语法不同的问题,在表示层数据将按照网络能理解的方式进行格式化,这种格式化也因所使用网络的类型不同而不同,

此时,虽然发送方知道自己发送的是什么东西,转换成字节数组后有多长,但组接收方肯定不知道,所以应用层的网络协议诞生了,

第七层:应用层,主要是一些终端应用(电脑屏幕上能够看到的,如WEB(IE浏览)、QQ等),它规定发送方和接收方必须使用一个固定长度的消息头,消息头必须使用某种固定的组成而且消息头里必须记录消息体的长度等一系列信息,以方便接收方能正确解析发送方发送的数据,应用层旨在让你更方便的接收到从网络层接收到的数据。至于数据的传递,没有该层,也可以在两台设备间进行。该层主要关注TCP/IP协议中的HTTP协议

先自上而下,后自下而上处理数据头部,如下图(七层架构):

注意:OSI并没有提供一个可以实现的方法,它只是一个概念模型,用来协调进程间通信标准的制定,即OSI参考模型并不是一个标准,而是一个在制定标准的时候所使用的概念性框架。而实现模型是TCP/IP四层架构参考模型。

TCP/IP协议:

并不是TCP和IP两个协议的合成,而是指因特网整个TCP/IP协议族;是一个四层架构参考模型。

见下表:
计算机网络方面的基础知识

OSI模型注重通信协议必要的功能是什么,而TCP/IP模型更强调在计算上实现协议应该开发哪种程序。

先自上而下,后自下而上处理数据头部,如下图(TCP/IP协议四层架构):
计算机网络方面的基础知识

2.TCP的三次握手:

小引:IP协议是无连接的通信协议,它不会占用两个正在通信的计算机之间的通信线路;这样,IP就降低了对网络线路的需求,每条线可以同时满足许多计算机之间的通信需要;通过IP,消息或者其他数据会被分割为许多较小的独立的包,通过因特网在计算机之间传输;IP负责将每个包路由至它的目的地;**但IP协议没有做任何事情,例如确认包是否按照顺序发送,或者包是否被破坏,因此,IP协议是不可靠的。**需要有它的上层协议来做出控制。

传输控制协议TCP协议简介

1)面向连接的、可靠的基于字节流的传输层通信协议;

2)将应用层的数据流分割成报文段,并发送给目标节点的TCP层;

3)数据包都有序号、对方收到则发送ACK确认,未收到则重传

4)使用奇偶校验和来检验数据在传输过程中是否有误。

TCP的报文头

注意:两个进程在计算机内部进行通信,是通过管道、内存共享、信号量、消息队列等方法进行通信的,而两个进程要进行通信,就需要具有唯一的的标识,在本地进程通信中,通过PID进行标识进程;但PID只在本地唯一,如果在两个不同的计算机上的两个进程要进行通信,就需要在传输层中使用协议端口号(IP层的IP地址可以唯一标识主机,而TCP协议和端口号可以唯一标识主机中的端口号),这样我们可以利用 “IP地址+协议+端口号” 来唯一标识进程(又称为套节字);通信的中的重点是应用进程,但我们只要把要传送的报文交到目的主机的一个合适的端口,剩下的工作交给TCP协议来完成即可。

  1. Source Port: 源端口,(2个字节)

  2. Destination Port: 目的端口,(2个字节)

  3. Sequence Number: 顺序号,(4个字节)用来表示TCP源端口向TCP目的端发送的数据字节流,它表示在这个报文段中的第一个数据字节的顺序号。【例如:一段报文的序号字段是107,而携带的字段共有100个字段,那么下一个报文段的话,其序号就应该是从(107+100=207)开始】

  4. Acknowledgment Number: 确认号,是发送确认的一端期望收到的下一个报文段中的第一个数据字节的顺序号(4个字节)【例如:b收到了a发送过来的报文,其***为301,而数据长度是200字节,这表明b正确的收到了a发送的到序号500(301+200-1)的数据,b期望收到a发送过来的下一个字段号是501,于是b在发送给a的报文段中,会把ack确认号设置为501】

  5. Offset:数据偏移,(4位)由于头部有可选字段,长度不固定,因此它指从TCP报文数据距离TCP报文的起始处有多远。

  6. Reserved:保留位,(6位)保留给将来时用的,目前设置为0.

  7. TCP Flags:控制位,(6位)在TCP报头中有6个常见标志比特,它们分别为:

URG:紧急指针标志;为1是有效,为0则忽略。

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

PSH:为1表示是带有PUSH标志的数据,指示接收方应该尽快将这个报文段交给应用层,而不需要等待缓存区装满。

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

SYN: 同步序号,为1表示连接请求,用于建立连接和是顺序号同步。

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

  1. Windom:数据字节数,源方接收窗口的大小,即从确认号开始,本报文的源方可以接受的字节数(2个字节)流量控制

  2. Checksum:校验和,是对整个TCP报文段(包括TCP头部和TCP数据),以16位字进行计算所得。(2个字节)

  3. Urgent Pointer:紧急指针,是发送端向另一端发送紧急数据的一种方式;为1时有效。

  4. TCP option:可选字段(最新常见的是最长报文大小,MSS)

  5. 数据:TCP报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有TCP首部。

说一说TCP的三次握手:

当应用程序希望通过TCP与另一个应用程序通信时,它会发送一个通信请求,这个请求必须被送到一个确切的地址,在双方握手之后,TCP将在两个应用之间建立一个"全双工"的通信,这个全双工的通信将占用两个应用程序之间的线路,直到连接被一方或者双方关闭为止。"全双工"意味着A在给B发送信息的时候,B也能同时给A发送信息。

"握手"是为了建立连接,TCP的三次握手的流程图如下:(TCP三次握手)
计算机网络方面的基础知识

第一次握手:建立连接时,客户端发送SYN包(SYN=1,seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到SYN包之后,必须确认客户的SYN(ACK=1,ack=x+1),同时自己也发送一个SYN包(SYN=1,seq=y),即SYN+ACK包,此时服务器进入SYN_REVD状态;

第三次握手:客户端收到服务器的SYN+ACK包后,向服务器发送确认包ACK(ACK=1,seq=x+1,ack=y+1),此包发送完毕,客户端和服务端进入ESTABLISHED状态,完成三次握手。

(前两次握手不能携带数据,第三次握手可以携带数据)

可以使用抓包软见wireshark,更加详细的去看看一次实际的TCP连接。

问题:为什么需要三次握手才能建立其连接?

为了初始化Sequence Number 的初始值:

通信的双方要互相通知对方自己的初始化的Sequence number(即上面的x,y),它们作为以后的数据通信的序号,以保证应用层接收到的数据不会因为网络上的传输问题而乱序,即TCP会用这个序号来拼接数据,因此,在服务器回发它的seq,即第二次握手之后,客户端还需要发送确认报文给服务器,告知服务器:“客户端已经收到你初始化之后的sequence number了!”

问题:首次握手的隐患----SYN超时

问题起因分析:

例如:Server收到client的SYN,回复SYN-ACK之后,未收到ACK确认(client掉线);此时Server不断重试直至超时,(默认重试次数为5次,重试间隔翻倍)Linux默认等待63秒才断开连接;

这样会导致服务器遭到SYN Flood风险,恶意程序会给服务器发送SYN报文,之后它就下线了;于是服务器需要默认等待63秒才会断开这个给连接,这样攻击者就可以把服务器SYN连接的队列耗尽,让正常的连接请求不能处理。

解决方法:Linux给出了tcp_syncookies参数来解决这个问题,当SYN队列满了之后,TCP会通过"原地址端口、目标地址端口、时间戳"打造出一个特别的sequence number(简称SYN Cookie)回发回去,如果是攻击者不会有响应,如果是正常用户则client会回发SYN Cookie,直接建立连接。

建立连接后,client突然出现故障怎么办?

TCP协议设有"保活机制":

向对方发送保活探测报文,如果未收到响应则继续发送;(keep alive time)

尝试次数达到保活探测数,仍未收到响应则中断连接

3.TCP的四次挥手:

"挥手"是为了终止连接,TCP四次挥手的流程图如下:(TCP四次挥手)
计算机网络方面的基础知识
第一次挥手:为了关闭连接,客户发送FIN包(FIN=1,seq=v)给服务端,客户端进入FIN_WAIT1状态;

第二次挥手:服务器收到FIN包之后,发送一个ACK给客户端(ACK=1,ack=v+1,seq=u),服务器进入CLOSE_WAIT状态,客户端进入了FIN_WAIT2状态;

第三次挥手:服务器发送一个FIN包(FIN=1,ACK=1,seq=w,ack=v+1)给客户端,用来关闭服务器到客户端的数据传送;服务器进入LAST_ACK状态;

第四次挥手:客户端在收到FIN包后,发送ACK包(ACK=1,seq=v+1,ack=w+1)给服务器,进入了TIME_WAIT状态;等待服务器进入CLOSED状态后,客户端才进入CLOSED状态,此时,才能完成四次挥手。

被动关闭连接的一方要较早的进入CLOSED状态

问题:为什么需要有TIME_WAIT状态?

原因:

1.确保有足够的时间让被动关闭的一方收到ACK包;

2.为了避免新旧连接混淆。

问题:为什么需要四次挥手才能断开连接?

TCP是"全双工"的通信,发送方和接收方都需要FIN报文和ACK报文,即发送方和接收方各只需两次挥手即可,只是一个是被动的,一个是在主动的,看上去就成了4次挥手。

问题:服务器出现大量的CLOSE_WAIT状态的原因:

对方关闭socket连接,我方忙于读或写,没有及时关闭连接;

此时,就需要我们去:

检查代码,特别是释放资源的代码;

检查配置,特别是处理请求的线程配置;

检查网络方面的问题:可以在Linux服务器命令行里面执行

netstat -n | awk’/^tcp/{++S[$NF]}END{for(a in S) print a,S[a]}’

(查看机器网络状态的指令:netstat)

4.UDP和TCP的区别:

UDP简介

UDP的特点:

1)面向非连接:【传输数据之前,源端和目标端之间不建立连接,当他想传送时,就简单的抓取来自应用程序的数据,并尽可能快的把它扔到网络上,在发送端UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制,在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读取一个消息段;】

2)不维护连接状态,支持同时向多个客户端传输相同的消息

3)数据包头只有8个字节(相比于TCP的20个字节),额外开销较小;

4)吞吐量只受限于数据生成速率、传输速率以及机器性能;(传输速度快

5)尽最大努力交付,不保证可靠交付,不需要维持复杂的连接状态表。

6)面向报文的,不对应用程序提交的报文信息进行拆分和合并。

小结(TCP和UDP的区别:)

1)面向连接 vs 无连接

2)可靠 vs 不可靠

3)有序 vs 无序

4)传输速度较慢 vs 传输速度较快(如:在线视频媒体、电视广播、多人在线游戏等)

5)重量级 vs 轻量级

5.TCP的滑动窗口:

RTT:发送一个数据包到收到对应的ACK,所花费的时间;

RTO:重传时间间隔;(基于RTT计算)

TCP使用滑动窗口做流量控制和乱序重排:
保证TCP的可靠性;
保证TCP的流控特性;

窗口数据的计算过程,如下图(TCP滑动窗口计算过程):

计算机网络方面的基础知识

TCP会话的发送方图示(TCP滑动窗口发送方):

计算机网络方面的基础知识

TCP会话的接收方图示:(TCP滑动窗口接收方)

计算机网络方面的基础知识

6.HTTP简介(超文本传输协议)

HTTP协议的特点:

(1)支持客户、服务器模式:client通过url向server发送请求,server向client响应消息;

(2)简单快速:客户端向服务器发送请求的时候,只需传送请求方法(get、post、had)和路径;由于HTTP简单,所以HTTP服务器规模小,因而通信速度很快;

(3)灵活:HTTP允许传输任意类型的数据;

(4)无连接:限制每次连接只处理一个请求,服务器处理完客户的请求并受到客户的应答之后,即断开连接,采用这种方式可以节省传输时间;

(5)无状态:协议对于事务处理没有记忆能力,当服务器需要先前数据时,每次都需要重传,这样可能导致每次传输的数据量增大。

#### HTTP请求结构:

请求方法 URL 协议版本 \n--------------------请求行
头部字段名:值 \n--------------------------请求头
头部字段名:值 \n
头部字段名:值 \n
\n
请求体

HTTP响应结构:

协议版本 状态码 状态码描述 \n--------------------响应行
头部字段名:值 \n-------------------------------响应头
头部字段名:值 \n
头部字段名:值 \n
\n
响应体

请求/响应的步骤:

(1)客户端连接到web服务器;

(2)发送HTTP请求;

(3)服务器接受请求,并返回HTTP响应;

(4)释放TCP链接;

(5)客户端浏览器解析HTML内容。

在浏览器地址栏键入URL,按下回车键之后经历的流程:

(1)DNS解析(浏览器缓存、系统缓存、路由器缓存、IPS服务器缓存、域名服务器缓存、*域名缓存);找到IP地址

(2)TCP连接;

(3)发送HTTP请求;

(4)服务器处理请求并返回HTTP报文;

(5)浏览器解析渲染页面

(6)连接断开(TCP挥手)

HTTP状态码:

1)1xx:指示信息—表示请求已接收,继续处理;

2)2xx:成功—表示请求已被成功接收、理解、接受;

3)3xx:重定向—要完成请求必须进行更进一步的操作;

4)4xx:客户端错误—请求有语法错误或请求无法实现;

5)5xx:服务端错误—服务器未能实现合法的请求。

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

get请求和post请求的区别:

从三个层面来回答:

HTTP报文层面:get将请求信息放在URL,post放在报文体中;

数据库层面:get符合幂等性和安全性,post不符合;

其他层面:get可以被缓存、被存储,而post不行。

HTTP和HTTPS的区别:

HTTPS比HTTP多了一层 SSL:

HTTP:

HTTP
TCP
IP

HTTPS:

HTTP
SSL
TCP
IP
SSL(Security Sockets Layer,安全套接层):

为网络通信提供安全及数据完整性的一种安全协议;

是操作系统对外的API,SSL3.0后更名为TLS;

采用身份验证和数据加密保证网络通信的安全和数据的完整性。

加密的方式:

对称加密:加密和解密都使用同一个**;

非对称加密:加密使用的**的解密使用的**匙不同的;

哈希算法:将任意长度的信息转换为固定长度的值,算法不可逆(MD5)

数字签名:证明某个消息或者文件是某人发出、认同的

HTTPS数据传输流程:

(1)浏览器将支持的加密算法信息发送给服务器;

(2)服务器选择一套浏览器支持的加密算法,以证书的形式回发浏览器;

(3)浏览器验证证书合法性,并结合证书公钥加密信息发送给服务器;

(4)服务器使用私钥解密信息,验证哈希,加密响应消息回应浏览器;

(5)浏览器解密响应消息,并对消息进行验证,之后进行加密交互数据。

HTTP和HTTPS的区别:

(1)HTTPS需要到CA申请证书,HTTP不需要;

(2)HTTPS密文传输,HTTP明文传输;

(3)连接方式不同:HTTPS默认使用443端口,HTTP使用80端口;

(4)HTTPS=HTTP+加密+认证+完整性保护,较HTTP安全

HTTPS真的安全吗?

那倒未必!

因为:浏览器默认填充http://,请求需要进行跳转,在HTTP向HTTPS跳转的过程中又被劫持的风险;

可以使用HSTS(http Strict Transport Security)优化