数据单元 | 设备 | 协议 | 功能 | |
---|---|---|---|---|
物理层 | 比特 bit | 中继器、集线器、网关 | RJ45、CLOCK、IEEE802.3 | 通过媒介传输比特,确定机械及电气规范 |
数据链路层 | 帧 frame | 网桥、交换机 | PPP、FR、HDLC、VLAN、MAC | 将比特组装成帧和点到点的传递 |
网络层 | 包 packet | 路由器 | IP、ICMP、ARP、RARP、IGMP、OSPF、IPX、RIP | 负责数据包从源到宿的传递和网际互联 |
传输层 | 段 segment | 进程、端口(socket) | TCP、UDP | 提供端到端的可靠报文传递和错误恢复 |
会话层 | SPDU | 服务器验证用户登陆、断点续传 | NFS、SQL、NETBIOS、RPC | 建立、管理和终止会话 |
表示层 | PPDU | URL加密、口令加密、图片编解码 | JPEG、MPEG、ASII | 对数据进行翻译、加密和压缩 |
应用层 | APDU | – | FTP、DNS、Telnet、SMTP、HTTP、WWW、NFS | 允许访问OSI环境的手段 |
首先, TCP 和 UDP 都是传输层的协议
面向连接的可靠传输
协议。非面向连接的不可靠传输
协议。,TCP与UDP区别总结:
三次握手的过程:
为什么TCP需要三次握手?
总的来说,两次不可靠,四次不高效。TCP是可靠的传输控制协议,三次握手能保证数据可靠传输又能提高传输效率,而且三次握手可以保证任何一次握手出现问题,都是可以被发现或补救的。
如果是两次握手:
在谢希仁著《计算机网络》第四版中讲“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。 现假定出现一种异常情况,即客户端发出的第一个连接请求报文段并没有丢失,而是在某些网络结点长时间滞留了,以致延误到连接释放以后的某个时间才到达服务端。本来这是一个早已失效的报文段。但服务端收到此失效的连接请求报文段后,就误认为客户端又发出一次新的连接请求。于是就向客户端发出确认报文段,同意建立连接。假定不采用三次握手,那么只要服务端发出确认后,新的连接便建立了。由于现在客户端并没有发出建立连接的请求,因此不会理睬服务端的确认,也不会向服务端发送数据。但服务端却以为新的运输连接已经建立了,并一直等待客户端发来数据。服务端的许多资源就这样白白浪费。采用三次握手的办法可以防止上述现象的发生。例如在刚才的情况下,客户端不会向服务端的确认发出确认。服务端由于收不到确认,就知道客户端并没有要求建立连接。
如果是4次及以上的握手:
三次握手之后,客户端和服务端可以保证正常通信,之后的次数都是徒劳没有必要,三次握手是可以建立链接的最少次数,节约资源使传输更加高效。
推荐博文TCP三次握手,为什么必须是三次?
四次分手的过程:
为什么断开需要四次?
TCP是全双工模式的,这就意味着,当客户端发出 FIN 报文段后,只是表示客户端已经没有数据要发送了;但是,这个时候客户端还是可以接受来自服务器的数据;当服务端返回 ACK 报文段时,表示它已经知道客户端没有数据要发送了,但是服务端还是可以发送数据到客户端的;当服务端也发送了 FIN 报文段后,这个时候就表示服务端也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。
首先,什么是 2MSL?
2MSL 即两倍的 MSL。
MSL(Maximum Segment Lifetime, 报文最大生存时间):任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。
因为 tcp 报文是 ip 数据报的数据部分,而 ip 头中有一个 TTL 域,TTL(time to live, 生存时间) 是由源主机设置的初始值并不是存的具体时间,是存储了一个 ip 数据报可以经过的最大路由数,每经过一个处理他的路由器此值就减1,当此值为0则数据报将被丢弃
,同时发送 ICMP 报文通知源主机。
RFC 793中规定MSL为2分钟,实际应用中常用的是30秒,1分钟和2分钟等。
TTL 与 MSL 是有关系的但不是简单的相等的关系,MSL 要大于等于TTL。
然后,为什么要等待?为什么不直接关闭要进入等待状态?
最后,为什么是 2MSL?
服务端收到 ACK 后会关闭连接,但是客户端无法知道自己的ACK是否已经到达服务端,于是开始等待?等待什么呢?假如ACK没有到达服务端,服务端会为 FIN 这个消息超时重传 timeout retransmit ,即客户端等待时间足够,“又”收到FIN消息,也就说明 ACK 没有到达服务端,于是客户端再发送 ACK,直到在足够的时间内没有收到 FIN,说明 ACK 成功到达。所以这个等待时间至少是:服务端的 timeout + FIN的传输时间,为了保证可靠,采用更加保守的等待时间 2MSL。
首先,了解 TCP 中的传输机制
然后,TCP粘包是什么?
基于 TCP 在数据传输中存在的三种机制,发送方发送的若干包数据到达接收方时可能会粘成了一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据的尾。
那么,如何解决粘包?
约定数据包长度
,即发送端和接收端约定一样的发送和接收的数据包长度,这样可以清晰的获取到我们需要的数据使用分隔符
,比如 smtp 协议就是在发送时,使用 \r\n 为分隔符,但如果发送的数据中也有 \r\n ,就容易搞混淆在每个数据包的开头利用2个或者4个字节描述整个数据包的长度
,接收端可以先接收2个或者4个字节,就可准确的知道真正的数据包是多长,从而正确获取需要的数据最后,UDP 有粘包嘛?
无保护消息边界
的。有保护消息边界
的,传输协议把数据当做一条独立的消息在网上传输,接收方一次只接受一条独立的信息,所以不存在粘包问题。大量 time_wait 的原因:
在高并发短连接
的TCP服务器上,当服务器处理完请求后立刻主动正常关闭连接,这个场景下会出现大量 socket 处于TIME_WAIT的状态。如果客户端的并发量持续很高,此时部分客户端就会显示连接不上。
短连接表示“业务处理+传输数据的时间 远远小于 TIMEWAIT超时的时间”的连接。
大量 close_wait 的原因:
close_wait:关闭 TCP 连接过程中,第 1 次挥手服务器接收客户端的 FIN 报文段,第 2 次挥手时,服务器发送了 ACK 报文段之后,服务器会进入 close_wait 状态。
究其原因是:
首先,什么是 select, poll, epoll?
select,poll,epoll是IO多路复用的机制。
I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。
IO多路复用适用如下场合:
I/O多路复用的技术优势:与多进程和多线程技术相比,系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。
select,poll,epoll
本质上都是同步I/O
,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。
其次, select, poll, epoll 之间的区别在于:
select 机制:准许进程指示内核等待多个事件中的任何一个发生,并通过无差别轮询
在有一个或多个事件发生或经历一段指定的时间后唤醒(解阻塞),本质上是通过设置或者检查存放 fd 标志位的数据结构来进行下一步处理。
select 优点:良好的跨平台性,几乎所有的平台都支持
select 缺点:
1). 单个进程可监视的套接字数量被限制,即能监听端口的大小有限。
一般来说这个数目和系统内存关系很大,32位机默认是1024个。64位机默认是2048.具体数目可以
cat /proc/sys/fs/file-max
查看。
2). 对socket进行扫描时是线性扫描,即采用轮询的方法,效率较低
当套接字比较多的时候,每次select()都要通过遍历FD_SETSIZE个Socket来完成调度,不管哪个Socket是活跃的,都遍历一遍。这会浪费很多CPU时间。如果能给套接字注册某个回调函数,当他们活跃时,自动完成相关操作,那就避免了轮询,这正是epoll与kqueue做的。
3). 需要维护一个用来存放大量 fd 的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大
poll 机制:与 select 在本质上没有多大差别,管理多个描述符也是进行轮询
,根据描述符的状态进行处理。它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态,如果设备就绪则在设备等待队列中加入一项并继续遍历,如果遍历完所有 fd 后没有发现就绪设备,则挂起当前进程,直到设备就绪或者主动超时,被唤醒后它又要再次遍历fd。这个过程经历了多次无谓的遍历。
poll 优点:没有最大连接数限制,原因是基于链表来存储的
poll 缺点:
1). 包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大。
2). poll 是“水平触发”的,如果报告了 fd 后,没有被处理,那么下次poll时会再次报告该 fd。
epoll 机制:是在 2.6 内核中提出的,相对于 select 和 poll ,epoll 更加灵活,没有描述符限制
,基于事件通知机制
。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次。
epoll 优点:
1). 没有最大并发连接的限制,(1G的内存上能监听约10万个端口)
2). 效率提升,基于事件通知机制非轮询的方式,不会随着 fd 数目的增加效率下降。只有活跃可用的 fd 才会调用 callback 函数,即epoll最大的优点在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,epoll的效率就会远远高于select和poll。
3). 内存拷贝,epoll通过内核和用户空间共享一块内存来实现的。利用 mmap() 文件映射内存加速与内核空间的消息传递,即 epoll 使用mmap减少复制开销。
综上,在选择select,poll,epoll 时要根据具体的使用场合以及这三种方式的自身特点。
水平触发、边缘触发的区别:
如果文件描述符自上次状态改变后有新的事件发生,此时会触发通知。在linux的 IO 多路复用中有水平触发,边缘触发两种模式
水平触发:处理完成才会停止通知
。当检测到文件描述符有事件发生并将该事件通知应用程序,如果应用程序不立即对其进行处理,它不会将事件丢弃,它将会一直提示。select,poll就属于水平触发。
边缘触发:一次通知
。在收到一个 IO 事件通知后要尽可能多的执行 IO 操作,因为如果在一次通知中没有执行完 IO 那么就需要等到下一次新的 IO 活动到来才能获取到就绪的描述符。epoll既可以采用水平触发,也可以采用边缘触发;信号驱动式IO就属于边缘触发。
另一角度理解水平触发和边缘触发的区别:
水平触发:在高电平(1)或低电平(0)时触发通知,只要在这两种状态就能得到通知。
边缘触发:在电平发生变化 (高电平到低电平,或者低电平到高电平) 的时候触发通知。
【使用场景注意】
水平触发没有边缘触发高
首先,认识端口的分类:
按端口号分布划分
知名端口(Well-Known Ports)
知名端口即众所周知的端口号,范围从0到1023,这些端口号一般固定分配给一些服务。比如21端口分配给FTP服务,25端口分配给SMTP(简单邮件传输协议)服务,80端口分配给HTTP服务,135端口分配给RPC(远程过程调用)服务等等。
动态端口(Dynamic Ports)
动态端口的范围从1024到65535,这些端口号一般不固定分配给某个服务,也就是说许多服务都可以使用这些端口。只要运行的程序向系统提出访问网络的申请,那么系统就可以从这些端口号中分配一个供该程序使用。在关闭程序进程后,就会释放所占用的端口号。
其次,如何查看端口?
netstat -an
'''
-a 表示显示所有活动的TCP连接以及计算机监听的TCP和UDP端口。
-e 表示显示以太网发送和接收的字节数、数据包数等。
-n 表示只以数字形式显示所有活动的TCP连接的地址和端口号。
-o 表示显示活动的TCP连接并包括每个连接的进程ID(PID)。
-s 表示按协议显示各种连接的统计信息,包括端口号。
'''
最后,常见的端口及对应服务有:
首先,HTTP 协议是什么?
HTTP(HyperText Transfer Protocol, 超文本传输协议) 是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。
HTTP是客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。通过使用网页浏览器、网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80)。我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源,比如HTML文件和图像。我们称这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个“中间层”,比如代理服务器、网关或者隧道(tunnel)。
尽管TCP/IP协议是互联网上最流行的应用,HTTP协议中,并没有规定必须使用它或它支持的层。事实上,HTTP可以在任何互联网协议上,或其他网络上实现。HTTP假定其下层协议提供可靠的传输。因此,任何能够提供这种保证的协议都可以被其使用。因此也就是其在TCP/IP协议族使用TCP作为其传输层。
通常,由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、或者其它信息。
然后,HTTP 的工作原理:
HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据;服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
HTTP 请求/响应的一般步骤:
客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。
发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求。
客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
HTTP协议的基本特性:
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文
根据 HTTP 标准,HTTP 请求可以使用多种请求方法。
方法 | 描述 |
---|---|
GET | 请求指定的页面信息,并返回实体主体。 |
HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 |
PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
DELETE | 请求服务器删除指定的页面。 |
CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
OPTIONS | 允许客户端查看服务器的性能。 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 。 |
主要区别在于:
Content-Type
消息头里,指明该消息体的媒体类型和编码,操作是对用户不可见的。首先,认识状态码的分类
HTTP状态码共分为5种类型:
分类 | 分类描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
常见的状态码:
状态码 | 状态码英文名称 | 中文描述 |
---|---|---|
100 | Continue | 继续。客户端应继续其请求 |
101 | Switching Protocols | 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议 |
200 | OK | 请求成功。一般用于GET与POST请求 |
301 | Moved Permanently | 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替 |
302 | Found | 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI |
404 | Not Found | 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面 |
500 | Internal Server Error | 服务器内部错误,无法完成请求 |
502 | Bad Gateway | 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应 |
503 | Service Unavailable | 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中 |
504 | Gateway Time-out | 充当网关或代理的服务器,未及时从远端服务器获取请求 |
详细的介绍博文推荐:https://www.cnblogs.com/shoshana-kong/p/10583760.html
HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP 的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
HTTPS 协议的主要作用:
HTTPS 和 HTTP 的区别主要如下:
https 协议需要到 ca 申请证书,一般免费证书较少,因而需要一定费用。
http是超文本传输协议,信息是明文传输
,https 则是具有安全性的ssl 加密传输协议
。
http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是80
,后者是443
。
http的连接很简单,是无状态的
;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的
网络协议,比http协议安全。
IP:逻辑上标记一台设备;MAC:网卡序列号,标记实际的转发数据的设备
首先需要 DNS 服务器解析出 www.baidu.com 的 IP 地址
1). 这是需要知道默认网关的 mac,于是,使用 RAP 协议获得默认网关的 mac
2). 组织数据发送给网关,(IP 还是 DNS 服务器的,但是 mac 地址是默认网关的mac)
3). 默认网关拥有转发数据的能力,将数据转发给路由器
4). 路由器根据自己的路由协议,选择合适的较快的路径转发数据给目的网关
5). 目的网关(即,DNS服务器所在的网关) 把数据转发给 DNS 服务器
6). DNS 服务器解析出 www.baidu.com 域名对应的 IP地址,并将其原路返回给请求的 client
得到 www.baidu.com 对应的 IP 后,进行 TCP 三次握手建立连接
1). 第一次握手:建立连接时,客户端发送 SYN=J 包到服务器,并且客户端进入 SYN_SENT 状态,等待服务器确认(SYN,同步序列编号)
2). 第二次握手:服务器收到 SYN=J 包,会发送 SYN+ACK 包给客户端,其中,ACK 为确认包 (ACK=J+1),同时服务器会发送自己的 SYN=K 包,此时,服务器进入 SYN_RECV状态
3). 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK=K+1,此包发送完毕,客户端和服务器进入ESTABLISHED (TCP连接成功) 状态,完成三次握手
基于 HTTP 协议实现与 web 服务器的数据通信。
1). 浏览器发送一个Request请求去获取 http://www.baidu.com
的html文件。
2). web 服务器接收到数据请求后,查询自己的服务器得到相应的响应,原路返回给浏览器,即服务器把 Response 文件对象发送回给浏览器。
3). 浏览器分析 Response 中的 HTML,发现其中引用了很多其他文件,比如Images文件,CSS文件,JS文件。浏览器会自动再次发送 Request 去获取图片,CSS文件,或者JS文件。
4). 当所有的文件都下载成功后,网页会根据HTML语法结构,完整的显示出来了。
四次挥手,释放 TCP 连接
1). 客户端关闭到服务端的连接,所以客户端发送一个 FIN 包,并且客户端进入FIN_WAIT1 状态
2). 服务器收到FIN 包,会向客户端发送一个 ACK 包,确认序号为收到的序号加1。此时,服务端进入 CLOSE_WAIT 状态,收到 ACK 的客户端会进入 FIN_WAIT2 状态
3). 服务器关闭到客户端的连接,所以服务端发送一个 FIN 包 给客户端,并且 服务端进入 LAST_ACK 状态
4). 客户端收到该 FIN 包会进入 TIME_WAIT 状态,并向服务端发回 ACK 报文确认,收到 ACK 后服务端进入 CLOSED 状态,等待2MSL 时间后无任何响应,客户端进入 CLOSED 状态
常见的密钥加密算法类型大体可以分为三类:对称加密、非对称加密、单向加密。
常见的对称加密算法有:
DES:分组式加密算法,以64位为分组对数据加密,加解密使用同一个算法。
3DES:三重数据加密算法,对每个数据块应用三次 DES 加密算法。
AES:高级加密标准算法,是美国联邦政府采用的一种区块加密标准,用于替代原先的 DES,目前已被广泛应用。
Blowfish:Blowfish算法是一个64位分组及可变密钥长度的对称密钥分组密码算法,可用来加密64比特长度的字符串。
其常见算法包括:
RSA:RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,可用于加密,也能用于签名。
DSA:数字签名算法,仅能用于签名,不能用于加解密。
DSS:数字签名标准,技能用于签名,也可以用于加解密。
ELGamal:利用离散对数的原理对数据进行加解密或数据签名,其速度是最慢的。
常见的算法包括:MD5、sha1、sha224等,其常见用途包括:数字摘要、数字签名等等。