OSI(Open System Interconnect)开放式系统互联模型
OSI参考模型:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
- 应用层:应用层为应用程序提供访问网络服务的接口,为用户直接提供各种网络服务。常见应用层的网络服务协议有:HTTP,HTTPS,FTP,POP3、SMTP等。
- 表示层:提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别
- 会话层:负责建立、管理和终止表示层实体之间的通信会话。
- 传输层:为上层协议提供端到端的可靠或者不可靠的数据传输服务。传输单位为数据段segment;协议有:TCP、UDP
- 网络层:通过IP寻址来建立两个节点之间的连接(解决网络路由和寻址问题)。协议有: IP、ARP、ICMP,传输单位是数据包packet
- 数据链路层:接受来自物理层的位流形式的数据,并封装成帧,传送到上一层;同样,也将来自上一层的数据帧,拆装为位流形式的数据转发到物理层;并且还负责处理接受端发回的确认帧的信息,以便提供可靠的数据传输。(传输单位为帧frame)MAC属于本层
- 物理层:利用传输介质为数据链路层提供物理连接,实现相邻计算机节点之间比特流的透明传输,尽可能屏蔽掉具体传输介质与物理设备的差异。网卡、集线器在物理层(数据传输单位bit)
协议栈
协议栈(Protocol Stack)是指网络中各层协议的总和
路由器
是连接因特网中各局域网、广域网的设备,它会根据信道的情况自动选择和设定路由,以最佳路径,按前后顺序发送信号。
路由器有两个部分组成,WAN和LAN,WAN是用来拨号的,是让路由自身能上网的一个部分,LAN是用来局域网内交换数据的,跟交换机的作用一样,我们的电脑插在LAN口才能上网
路由内置DHCP服务器,可以为使用路由的电脑自动分配IP
路由器在网络层
交换机
是一种用于电(光)信号转发的网络设备。作用可以简单的理解为将一些机器连接起来组成一个局域网。它可以为接入交换机的任意两个网络节点提供独享的电信号通路。
他只有LAN,没有WAN
把网线插进交换机的任意接口,把电脑1插进交换机的任意接口,把电脑2插进交换机的任意接口,这样两台电脑都需要拨号才能上网,以此看来交换机是用来数据交换的
交换机在数据链路层(也有多层交换机:数据链路层+ 部分网络层)
猫
把光纤转换成直接能插在电脑上的网线
TCP/IP模型
应用层(OSI模型的会话层和表示层合并到应用层中)
传输层
网际互联层(对应于OSI参考模型的网络层)也经常成为IP层
网络接入层或者主机到网络层(OSI参考模型中的物理层和数据链路层相对应)
-
IP层中包含网际控制报文协议(ICMP:Internet Control Message Protocol)和地址解析协议ARP,实际上他们并不是IP层的一部分,但直接同IP层一起工作。ICMP用于传递差错信息、时间、回显、网络信息等报文控制数据 。ARP处于IP和数据链路层之间,它是在32位IP地址和48位局域网地址之间执行翻译的协议
-
以太网数据格式:
以太网用48bit(6字节)来表示原地址和目的地址。这里的源地址和目的地址指的是硬件地址,例如网卡的MAC地址。
在地址后面是两个字节的表示类型的字段,例如0800表示帧的数据为IP数据,0806表示此帧为ARP请求
类型字段之后的数据,对于以太网,规定数据段的大小范围是46个字节到1500个字节,不足的数据要用空字符填满。例如ARP协议的数据格式为28个字节,为了符合规范,其后有18个字节的占位符用于满足最少46字符的要求
数据段的长度有一个最大值,以太网为1500,这个特性为MTU,即最大传输单元。如果IP层有一个要传送的数据长度比MTU大,在IP层数据要进行分片,使得每个片都小于MTU
CRC字段用于对帧内数据进行校验,保证数据传输的正确性,通常由硬件实现,例如网卡设备中实现网络数据的CRC校验
以太网的头部14字节的特点在某些平台的实现上会造成效率上的问题,例如4字节对齐的平台,在取得IP数据的时候通常会重新复制一次
ARP地址解析协议
ARP(Address Resolution Protocol,地址解析协议)是一个位于TCP/IP协议栈中的网络层,负责将某个IP地址解析成对应的MAC物理地址。
在以太网为基础的局域网中,每个网络接口都有一个硬件地址,这是一个48bit的值,标识不同的以太网设备,在局域网中的必须知道网络设备硬件地址才能向目的主机发送数据,而在网际网中数据传输的目的地址是IP地址,数据要能够正常地传输,必须建立IP地址和硬件地址的映射记录,
32位IP地址到48位硬件地址映射的ARP协议
IP(网际协议)
IP层的主要目的是提供子网的互联,形成较大的网络,使不同的子网之间能传输数据。
IP层的主要作用:
- 数据传送:将数据从一个主机传输到另一个主机
- 寻址:根据子网划分和IP地址,发现正确的目的主机地址
- 路由选择:选择数据在互联网上的传输路径
- 数据报文的分段:当传输的数据大于MTU时候,将数据进行分段发送和接收并组装。
IPV4的IP地址32位,由四组十进制数组成,每组数值范围0-255,中间.分隔,
一个IP地址由IP地址类型、网络ID、主机ID组成
网络类型标识符标识本IP地址所属的类型
网络ID标识IP标识设备或主机所在的网络
主机ID标识网络上的工作站、服务器或者路由选择器。
主机ID全为0的地址表示某个网络的网络地址
主机ID全为1的地址表示广播地址
IP全为0的地址表示主机本身,发往此IP地址的数据分组由本机接收
IP全为1的地址表示有限广播地址
IP地址127.0.0.1是特殊的回环地址,一般用于本地测试使用
IP协议是用于将多个包交换网络连接起来的,它在源地址和目的地址之间传送一种称之为数据包的东西,它还提供对数据大小的重新组装功能,以适应不同网络对包大小的要求。
网络层IP提供的是一种不可靠的服务。它只是尽可能快地把分组从源节点送到目的节点,但不提供任何可靠性的保证。
网络控制报文协议(ICMP)
用于传送差错信息、时间、回显、网络信息等报文控制数据,常用来检测网络通不通,主机是否可达,路由器是否可用。
ICMP协议可分为两大类,一是查询报文,一是差错报文。
UDP协议
UDP:user data protocol 用户数据报文协议--- 一个不可靠的、无连接协议;适用于不怕数据丢失、不需要对报文进行排序、流量控制的场景
UDP协议不保证数据报文传输的顺序、不保证数据准确到达
UDP协议相比较于TCP协议执行速度比TCP快得多,因为UDP协议简单得多,对系统造成的负载低
应用场景:流媒体的传输、域名服务器、嵌入式机顶盒系统
TCP协议
TCP:transmission control protocol 传输控制协议---在不可靠的ip层上,提供了一个可靠的、面向连接的、流控的传输层协议,为了提供这种可靠的服务,TCP采用了超时重传、滑动窗口、发送和接收端到端的确认分组等机制,保证接收端能接收到发送端的所有包,并顺序与发出顺序一致。
滑动窗口:接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度,从而达到防止发送方发送速度过快而导致自己被淹没的目的。
TCP特点:
- 面向连接的服务:在数据进行传输之前,需要先建立连接,之后TCP报文在此连接的基础上进行传输
- 可靠传输服务:基于校验和应答重发机制保证传输的可靠性
- 缓冲传输:可以延迟传送应用层的数据,允许将应用程序需要传送的数据积攒到一定数量才进行集中发送
- 全双工传输:以全双工的方式进行数据流交换
- 流控传输:通过滑动窗口机制,支持主机间的端到端的流量控制
- 字节流的服务:基于字节流的服务没有字节序问题的困扰
三次握手
- 起始状态客户端A和服务端B都处于CLOSED状态
- 服务端B创建socket,绑定ip,监听指定端口,处于LISTEN状态,等待客户端A的请求
- 客户端A创建socket,发送连接请求(SYN = 1,seq = x)报文,进入SYN-SENT状态,等待服务器确认
- 服务端B收到连接请求,向客户端A发送确认(ACK=1,确认号ack=x+1)报文,并同时自己也发送一个SYN包(SYN=1,seq =y),进入SYN-RCVD状态
- 客户端A收到服务端B的确认后,给服务端B发出确认(ACK=1,ack=y+1,seq=x+1),A进入ESTABLISHED状态
- 服务端B收到客户端A的确认后,进入ESTABLISHED状态
未连接队列
在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于SYN_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。
四次挥手
- 初始状态客户端A和服务端B都处于ESTABLISHED状态
- 客户端A的向服务器端发送连接释放报文(FIN=1,序列号seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN-WAIT-1(终止等待1)状态,等待服务器端B的确认
- 服务器端B收到连接释放报文段后即发出确认报文段,(ACK=1,确认号ack=u+1,序号seq=v),服务器端进入CLOSE-WAIT(等待关闭状态),此时TCP处于半关闭状态,客户端A到服务器端B的连接释放
- 客户端A收到服务器端B的确认后,进入FIN_WAIT-2(终止等待2)状态,等待服务器端B发出连接释放报文段
- 服务端B没有要向客户端A发出的数据,服务器端B发出连接释放报文段(FIN=1,ACK=1,序列号seq=w,确认号ack=u+1),服务器端进入LAST-ACK(最后确认)状态,等待客户端A的确认
- 客户端A收到服务端B的连接释放报文后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),客户端A进入TIME-WAIT(时间等待)状态。此时TCP未释放,需要经过时间等待计时器设置的时间2MSL后,A才进入CLOSED状态。
https://www.cnblogs.com/Andya/p/7272462.html
为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。
Server端易受到SYN***
服务器端的资源分配是在二次握手时分配的,而客户端的资源是在完成三次握手时分配的,所以服务器容易受到SYN洪泛***,SYN***就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server则回复确认包,并等待Client确认,由于源地址不存在,因此Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。
防范SYN***措施:降低主机的等待时间使主机尽快的释放半连接的占用,短时间受到某IP的重复SYN则丢弃后续请求。
TCB传输控制块Transmission Control Block,存储每一个连接中的重要信息,如TCP连接表,到发送和接收缓存的指针,到重传队列的指针,当前的发送和接收序号。
SYN=1的报文段不能携带数据
为什么连接的时候是三次握手,关闭的时候却是四次握手
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
什么是HTTP
HTTP协议是Hyper Text Transger Protocal(超文本传输协议)的缩写
用于从万维网(www:World Wide Web)服务器传输超文本到客户端的传输协议
HTTP是一个 基于TCP/IP通信协议来传递数据,默认HTTP的端口号为80
HTTP是一个属于应用层协议
由请求和响应构成,是一个标准的客户端服务器模型
HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记
HTTP是一个无状态的协议,无状态是指协议对于事务处理没有记忆能力
HTTP传输面临的风险
窃听风险:***可以获取通信内容。
篡改风险:***可以修改通信内容。
冒充风险:***可以冒充他人身份参与通信
什么是SSL/TLS
SSL是Secure Sockets Layer的缩写,中文叫做“安全套接层”
TLS是Transport Layer Security”的缩写,中文叫做“传输层安全协议”
SSL是指安全套接层协议(以及传输层协议TLS),位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。
什么是HTTPS
HTTPS 协议(HyperText Transfer Protocol over Secure Socket Layer) 还是要基于 TCP 来传输(所谓的“HTTP over SSL”,实际上是在原有的 HTTP 数据外面加了一层 SSL 的封装。HTTP 协议原有的 GET、POST 之类的机制,基本上原封不动)
HTTPS协议承载于TLS或SSL协议层之上,HTTPS的端口号为443
HTTPS特点
保密性(防泄密-有信息都是加密传播,***无法窃听)、完整性(防篡改-具有校验机制,一旦被篡改,通信双方会立刻发现)、真实性(防假冒-配备×××书,防止身份被冒充)
- 防流量劫持
全站Https是根治运营商、中间人流量劫持的解决方案,不仅可以杜绝网页中被插入的小广告,更可以保护用户隐私安全。 - 提升搜索排名
采用Https可以帮忙搜索排名的提升,提高站点的可信度和品牌形象。 - 杜绝钓鱼网站
Https地址栏绿×××标可以帮助用户识别出钓鱼网站,保障用户和企业的利益不受损害,增强用户信任。
HTTP与TCP之间的关系
HTTP协议通常承载于TCP协议之上; HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。 IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠地传递数据包,使得网络上接收端收到发送端所发出的所有包,并且顺序与发送顺序一致。TCP协议是可靠的、面向连接的。
网络层: IP协议/ARP协议
传输层:TCP/UDP协议
应用层:HTTP协议
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
主机 A 的应用程序要能和主机 B 的应用程序通信,必须通过 Socket 建立连接,而建立 Socket 连接必须需要底层 TCP/IP 协议来建立 TCP 连接。建立 TCP 连接需要底层 IP 协议来寻址网络中的主机。我们知道网络层使用的 IP 协议可以帮助我们根据 IP 地址来找到目标主机,但是一台主机上可能运行着多个应用程序,如何才能与指定的应用程序通信就要通过 TCP 或 UPD 的地址也就是端口号来指定。
长连接和短连接
HTTP 对 TCP 连接的使用,分为两种方式:俗称“短连接”和“长连接”(“Keep-Alive”或“Persistent Connection”)
长连接:当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
使用长连接的HTTP协议,会在响应头加入这行代码:Connection:keep-alive
如果HTTP1.1版本的HTTP请求报文不希望使用长连接,则要在HTTP请求报文首部加上Connection: close。
TCP的保活功能主要为服务器应用提供,试图在服务端器端检测到半开放的连接,并根据响应决定是否关闭连接
短连接:客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。双方任意都可以发起close操作,不过一般都是client先发起close操作。
短连接的优点是:管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段。
短连接的操作步骤
建立连接——数据传输——关闭连接...建立连接——数据传输——关闭连接
长连接的操作步骤是:
建立连接——数据传输...(保持连接)...数据传输——关闭连接
长连接和短连接优缺点
长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户来说,较适用长连接。不过这里存在一个问题,存活功能的探测周期太长,还有就是它只是探测TCP连接的存活,属于比较斯文的做法,遇到恶意的连接时,保活功能就不够使了。在长连接的应用场景下,client端一般不会主动关闭它们之间的连接,Client与server之间的连接如果一直不关闭的话,会存在一个问题,随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端需要采取一些策略,如关闭一些长时间没有读写事件发生的连接,这样可 以避免一些恶意连接导致server端服务受损;如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接数,这样可以完全避免某个蛋疼的客户端连累后端服务。
短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。但如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。
长连接和短连接的产生在于client和server采取的关闭策略,具体的应用场景采用具体的策略,没有十全十美的选择,只有合适的选择。
长连接的数据传输完成识别
判断传输数据是否达到了Content-Length指示的大小;
动态生成的文件没有Content-Length,它是分块传输(chunked),这时候就要根据chunked编码来判断,chunked编码的数据在最后有一个空chunked块,表明本次传输数据结束。
长连接的过期时间
keepalive_timeout 20; --长连接timeout
keepalive_requests 8192; --每个连接最大请求数
什么时候用长连接,短连接
长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。
而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。
设置HTTP长连接,有过期时间
设置请求头域
在首部字段中设置Connection:keep-alive 和Keep-Alive: timeout=60,表明连接建立之后,空闲时间超过60秒之后,就会失效。如果在空闲第58秒时,再次使用此连接,则连接仍然有效,使用完之后,重新计数,空闲60秒之后过期。
设置HTTP长连接,无过期时间;在首部字段中只设置Connection:keep-alive,表明连接永久有效。connection字段只有服务端设置才有效。
connection字段只有服务端设置才有效。
客户端设置Connection: Keep-Alive和Keep-Alive: timeout=60, 服务端设置Connection: Keep-Alive和Keep-Alive: timeout=5。
如何理解HTTP协议是无状态的
HTTP协议是无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。也就是说,打开一个服务器上的网页和上一次打开这个服务器上的网页之间没有任何联系。
MTU相关问题
比较 GET 与 POST
转载于:https://blog.51cto.com/12880687/2107457