OSI分层(7层):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
TCP/IP分层(4层):网络接口层、网际层、运输层、应用层。
五层协议(5层):物理层、数据链路层、网络层、运输层、应用层。
每一层的协议如下:
物理层:RJ45、CLOCK、IEEE802.3(中继器,集线器,网关)
数据链路:PPP、FR、HDLC、VLAN、MAC (网桥,交换机)
网络层:IP、ICMP、ARP、RARP、OSPF、IPX、RIP、IGRP (路由器)
传输层:TCP、UDP、SPX
会话层:NFS、SQL、NETBIOS、RPC
表示层:JPEG、MPEG、ASII
应用层:FTP、DNS、Telnet、SMTP、HTTP、WWW、NFS
每一层的作用如下:
物理层:通过媒介传输比特,确定机械及电气规范(比特 Bit)
数据链路层:将比特组装成帧和点到点的传递(帧 Frame)
网络层:负责数据包从源到宿的传递和网际互连(包 PackeT)
传输层:提供端到端的可靠报文传递和错误恢复(段 Segment)
会话层:建立、管理和终止会话(会话协议数据单元 SPDU)
表示层:对数据进行翻译、加密和压缩(表示协议数据单元 PPDU)
应用层:允许访问 OSI 环境的手段(应用协议数据单元 APDU)
地址解析协议,即 ARP(Address Resolution Protocol),是根据 IP 地址获取物理地址的一个 TCP/IP 协议。
1.首先,每个主机都会在自己的 ARP 缓冲区中建立一个 ARP 列表,以表示 IP 地址和 MAC 地址之间的对应关系。
2.当源主机要发送数据时,首先检查ARP列表中是否有对应 IP 地址的目的主机的 MAC 地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送 ARP 数据包,该数据包包括的内容有:源主机IP地址,源主机 MAC 地址,目的主机的 IP 地址
3.当本网络的所有主机收到该 ARP 数据包时,首先检查数据包中的 IP 地址是否是自己的 IP 地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的 IP 和 MAC 地址写入到 ARP 列表中,如果已经存在,则覆盖,然后将自己的 MAC 地址写入 ARP 响应包中,告诉源主机自己是它想要找的 MAC 地址。
4.源主机收到 ARP 响应包后。将目的主机的 IP 和 MAC 地址写入 ARP 列表,并利用此信息发送数据。如果源主机一直没有收到 ARP 响应数据包,表示 ARP 查询失败。
注意:广播(255.255.255.255)发送 ARP 请求,单播发送 ARP 响应。
当 DNS 客户机需要在程序中使用名称时,它会查询 DNS 服务器来解析该名称。客户机发送的每条查询信息包括三条信息:包括:指定的 DNS 域名,指定的查询类型,DNS 域名的指定类别。基于 UDP 服务,端口53. 该应用一般不直接为用户使用,而是为其他应用服务,如 HTTP,SMTP等在其中需要完成主机名到IP地址的转换。
面向连接的服务,通信双方在进行通信之前,要先在双方建立起一个完整的可以彼此沟通的通道,在通信过程中,整个连接的情况一直可以被实时地监控和管理。
非面向连接的服务,不需要预先建立一个联络两个通信节点的连接,需要通信的时候,发送节点就可以往网络上发送信息,让信息自主地在网络上去传,一般在传输的过程中不再加以监控。
答:建立连接的过程是利用客户服务器模式,假设主机 A 为客户端,主机 B 为服务器端。
(1)TCP 的三次握手过程:主机 A 向 B 发送连接请求;主机 B 对收到的主机 A 的报文段进行确认;主机 A 再次对主机 B 的确认进行确认。
(2)采用三次握手是为了防止失效的连接请求报文段突然又传送到主机 B,因而产生错误。失效的连接请求报文段是指:主机 A 发出的连接请求没有收到主机 B 的确认,于是经过一段时间后,主机 A 又重新向主机 B 发送连接请求,且建立成功,顺序完成数据传输。考虑这样一种特殊情况,主机 A 第一次发送的连接请求并没有丢失,而是因为网络节点导致延迟达到主机 B,主机 B 以为是主机 A 又发起的新连接,于是主机 B 同意连接,并向主机 A 发回确认,但是此时主机 A 根本不会理会,主机 B 就一直在等待主机 A 发送数据,导致主机 B 的资源浪费。(这就是缺少第三次握手( A 再给 B 确认))
(3)采用两次握手不行,原因就是上面说的实效的连接请求的特殊情况。
就是说如果只进行两次握手,那么就存在以下问题:
1.如果只进行两次握手,那么服务器只能确认客户端的请求,但是客户端无法确认服务器是否已经收到自己的请求,从而无法保证连接的可靠性。
2.可能存在历史连接的延续。假设客户端发送一个连接请求,但是由于某种原因导致服务器没有收到请求,客户端可能会认为连接已经建立,但是服务器并不知道。如果后来有其他客户端向服务器发送请求,而请求中恰好包含了与之前客户端相同的源地址和端口号,那么服务器就会误认为这是之前客户端发送的请求,从而建立连接,这就导致了历史连接的延续,可能会给网络带来安全隐患。
因此,为了保证连接的可靠性和安全性,TCP采用了三次握手的方式建立连接。
a)在用户登录之后,服务器返回响应的时候会在响应中添加上cookie
b)浏览器接收到cookie之后会自动保存
c)当用户再次请求其他网页的时候,浏览器会自动带上之前保存的cookie
d)服务器接收到请求之后可以到 request 对象中取到cookie 判断当前用户是否登录
联想回答:
HTTP是无状态的,就是连接时数据互通,关闭后就是永别,永久性失忆,为啥是无状态的呢?因为浏览器和服务器之间用的是socket通信的啊,一旦关闭浏览器,四次挥手之后就销毁所有交互信息(谈谈tcp三次握手,四次挥手)那么让浏览器跟服务器之间保持状态的方法是什么呢,cookie和session区别:cookie保 存在浏览器,每次访问网站都会将本地保存cookies值(用户个人信息)发送到网站,不安全,每个域名下的cookie独立存在,互不干扰。seesion依赖cookie存在,但它保存在服务器上,比cookie更安全,细节:session存的数字不会转成字符串,而cookie存值会转为字符串
1.首先由DNS服务器解析出baidu.com对应的IP地址。
2.要先使用ARP获取默认网关的mac地址。
3.组织数据发送给默认网关(IP还是DNS服务器的IP,但是mac地址是默认网关的mac地址),默认网关拥有转发数据的能力,把数据转发给路由器。
4.路由器根据自己的路由协议,来选择一个合适的较快的路径转发数据给目的网关。
5.目的网关(DNS服务器所在的网关),把数据转发给DNS服务器。
6.DNS服务器查询解析出baidu.com对应的ip地址,并原路返回请求这个域名的client。
7.得到了baidu.com对应的IP地址之后,会发送tcp的3次握手,进行连接。
8.使用HTTP协议发送请求数据给web服务器。
9.web服务器收到数据请求之后,通过查询自己的服务器得到的相应的结果,原路返回给浏览器。
10.浏览器接收到数据之后通过浏览器自己的渲染功能来显示这个网页。
11.浏览器关闭tcp连接,即4次挥手结束,完成整个访问过程。
OSI模型称为开放式系统互联通信参考模型,将计算机网络体系结构分为七层:
第一层:物理层(比特流传输),相当于邮局中一线的搬运工人。
第二层:数据链路层(提供介质访问,链路管理),相当于邮局中的装拆箱工人。MAC地址在这一层。
第三层:网络层(寻址和路由选择),相当于邮局中为邮件物品按地区分类排序的工人。IP地址在这一层。
第四层:传输层(提供终端到终端的可靠连接),相当于公司中给邮局去寄信件的职员。
第五层:会话层(建立维护和管理会话),相当于公司中负责收寄信,装信封拆信封的秘书之类的人员。
第六层:表示层(处理数据格式,数据加密等),相当于公司中替老板写信的助理。
第七层:应用层(提供应用程序间通信),相当于大老板。
第一层:网络接口层(对应七层模型中的物理层和数据链路层)
第二层:网络层
第三层:传输层
第四层:应用层(对应会话层、表示层和应用层)
ARP称为地址解析协议,是根据IP地址获取物理地址的一个TCP/IP协议。
主机将包含目标IP地址的ARP请求广播到网络上的所有主机,然后通过接收返回的消息来确定目标的物理地址。
HTTP协议是超文本传输协议,是web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。它属于应用层。HTTP连接最显著的特点就是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。HTTP是用来在网络上传输HTML文本的协议,用于浏览器和服务器的通信。有一点需要注意,它是明文传输,为了安全可以使用HTTPS协议。
HTTPS协议其实就是HTTP套了一层SSL/TLS外壳。这也是它最大的特点,安全。HTTP协议是应用层直接将数据给到TCP进行传输,HTTPS则是改成应用层将数据给到SSL/TLS,将数据加密之后再给TCP进行传输。
HTTP的端口是80;HTTPS的端口是443。SSL是一个加密套件,证书,TLS是SSL的升级版。
1、请求行:请求方法、资源路径、HTTP协议版本
GET / HTTP/1.1\r\n
2、请求头:有好多,而且不一,只说一下格式:
头名称:头对应的值\r\n
3、空行和请求体
HTTP响应报文格式
状态行:协议的版本、状态码、状态说明
HTTP/1.1 200 OK\r\n
响应头:
头名称:头对应的值\r\n
空行和响应体
TCP称作传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。通过三次握手建立连接,通讯完成时四次挥手终止通讯。它的优点就是在数据传递时,有发送应答机制、超时重传机制、错误校验机制、阻塞管理机制等,能保证数据的正确性,可靠。缺点就是相对于UDP来说速度慢一点,要求系统资源也多一点。
TCP/IP协议是传输层协议,主要解决数据如何自网络中传输。HTTP是应用层协议,主要解决如何包装数据。IP协议处于网络层。
**文邹邹晦涩版答案:**客户端将标志位SYN置为1,随机产生一个值seq(假装是J吧),然后将该数据包发送给服务器。服务器收到数据包之后将标志位SYN和ACK都置为1,ack=J+1。随机产生一个值seq(假装是K吧),然后将该数据包发送给客户端,确认连接请求。客户端收到确认后,看一下ack是不是J+1,看看ACK是不是1,确认无误之后就将标志位ACK置为1,ack=K+1,然后将数据包发送给服务器。服务器检查一下ack和ACK的值是不是K+1和1,正确了就连接成功。
SYN: 表示连接请求 ACK: 表示确认 FIN: 表示关闭连接 seq:表示报文序号 ack: 表示确认序号
**生动举例版:**A:“喂,老哥,在不?”B:“在呢,咋地啦?”A:“嗯,和你说件事…”巴拉巴拉的开始唠嗑…
**文邹邹晦涩版答案:**客户端和服务器都可以主动关闭,我们以客户端主动关闭连接为例。
第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送。
第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1。
第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送。
第四次挥手:Client收到FIN后,接着发送一个ACK给Server,确认序号为收到序号+1。
**生动举例版:**因为连接时双向通信的,必须双方都同意关闭才算关闭。就好像谈恋爱,俩人都同意分手,才分得彻底,要不然还是藕断丝连。
主动发送 fin 关闭的一方,在 4 次挥手最后一次要等待一段时间我们称这段时间为 2MSL。
就好像分手一样,客户端主动关闭的,你得为这件事负责吧?客户端为了确保服务器收到最后一次挥手的报文。如果最后一次丢包了,服务器没有收到第四次挥手的报文,还以为客户端不想分手,就会再重发一次第三次挥手的报文,看看客户端是不是后悔了,不想分手了。这个等待时间就是为了接收超时重传的报文。
假如客户端发完就断开了链接,然后服务器一直等不到回应,重传了报文还是没有得到回应,服务器不死心啊,服务器就关闭不了链接。客户端这时就是典型的渣男角色,分手你别让别人还抱有幻想是不是?说多了,回归正题。
tcp最大的特点就是数据不会丢失啊,客户端渣渣的建立了新连接,然后发现有一个旧的数据包,然后让客户端的新连接也不好了,这就叫自食其果。所以有了这个等待时间,既保证了双方都正常关闭,又保证了所有报文段消失,不会在新连接中出现旧的请求报文段。
先回忆一下后端服务器,它其实分为了web服务器和web框架。web服务器负责解析请求报文,调用框架程序处理请求;组织响应报文,返回内容给客户端。web框架则是负责路由分发(根据url找到对应的处理函数);处理函数中进行业务的处理。
WSGI其实就是为python语言定义的web服务器和web框架之间的一个接口。用来描述web服务器如何与web框架通信的规范。
WSGI协议中,重中之重就是一个接口函数:
def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return [b'Hello, web!
']
第一个参数是字典类型的请求地址、请求方式等。第二个参数是一个回调函数,用来传递响应状态结果。返回值是响应体。
实现的过程很是巧妙,帮大家简单的回忆一下:
1.在服务器中调用application函数。
2.在服务器中定义用来储存返回的响应头信息的回调函数,函数有两个参数,一个是状态,一个是其它信息,以字典形式传入。
3.在服务器中以字典传入请求地址名,传入回调的函数名。
4.在框架中定义application函数,当处理完数据后,调用传入的函数并返回数据。
5.服务器收到返回的信息后进行响应信息的拼接处理。
通过WSGI接口,可以实现服务器和框架的功能分离。便于服务器的迁移和维护。
只列出一些特殊的,常见的大家都知道了,此处不做列出。
状态码 | 解释说明 |
---|---|
302 | 跳转,新的url在响应的location头中给出 |
303 | 浏览器对于POST的响应进行重定向 |
307 | 浏览器对于POST的响应进行重定向 |
503 | 服务器维护或者负载过重未应答 |
2MSL即两倍的MSL,TCP的TIME_WAIT状态也称为2MSL等待状态,当TCP的一端发起主动关闭,在发出最后一个ACK包后,即第3次握 手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,必须在此状态上停留两倍的MSL时间,等待2MSL时间主要目的是怕最后一个 ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。在TIME_WAIT状态 时两端的端口不能使用,要等到2MSL时间结束才可继续使用。当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。不过在实际应用中可以通过设置 SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。
GET 的语义是从服务器获取指定的资源,这个资源可以是静态的文本、页面、图片视频等。GET 请求的参数位置一般是写在 URL 中,URL 规定只能支持 ASCII,所以 GET 请求的参数只允许 ASCII 字符 ,而且浏览器会对 URL 的长度有限制(HTTP协议本身对 URL长度并没有做任何规定)。比如,你打开我的文章,浏览器就会发送 GET 请求给服务器,服务器就会返回文章的所有文字及资源。
POST 的语义是根据请求负荷(报文body)对指定的资源做出处理,具体的处理方式视资源类型而不同。POST 请求携带数据的位置一般是写在报文 body 中,body 中的数据可以是任意格式的数据,只要客户端与服务端协商好即可,而且浏览器不会对 body 大小做限制。比如,你在我文章底部,敲入了留言后点击「提交」,浏览器就会执行一次 POST 请求,把你的留言文字放进了报文 body 里,然后拼接好 POST 请求头,通过 TCP 协议发送给服务器。
GET 请求,请求的数据会附加在 URL 之后,以?分割 URL 和传输数据,多个参数用&连接。URL 的编码格式采用的是 ASCII 编码,而不是 uniclde,即是说所有的非 ASCII 字符都要编码之后再传输。
POST 请求:POST 请求会把请求的数据放置在 HTTP 请求包的包体中。上面的 item=bandsaw 就是实际的传输数据。
因此,GET 请求的数据会暴露在地址栏中,而 POST 请求则不会。
在 HTTP 规范中,没有对 URL 的长度和传输的数据大小进行限制。但是在实际开发过程中,对于 GET,特定的浏览器和服务器对 URL 的长度有限制。因此,在使用 GET 请求时,传输数据会受到 URL 长度的限制。
对于 POST,由于不是 URL 传值,理论上是不会受限制的,但是实际上各个服务器会规定对 POST提交数据大小进行限制,Apache、IIS 都有各自的配置。
POST 的安全性比 GET 的高。这里的安全是指真正的安全,而不同于上面 GET 提到的安全方法中的安全,上面提到的安全仅仅是不修改服务器的数据。比如,在进行登录操作,通过 GET 请求, 用户名和密码都会暴露再 URL 上,因为登录页面有可能被浏览器缓存以及其他人查看浏览器的历史记录的原因,此时的用户名和密码就很容易被他人拿到了。除此之外,GET 请求提交的数据还可能会造成 Cross-site request frogery 攻击。
GET 比 POST 效率高。
OSI七层协议(Open System Interconnection reference model)是一个由国际标准化组织(ISO)提出的标准通信协议体系结构,该体系结构把计算机网络体系结构的各个方面分割成了七个不同的抽象层,每一层都有各自的通信功能。OSI七层协议由上往下依次为:
物理层是位于通信系统底层的协议层,主要负责把比特流转化为可以在物理介质上传输的物理信号。物理层主要涉及数据传输的物理介质、机械电气特性、接口标准、传输速率和数据传输距离等问题。
数据链路层主要建立在物理层之上,是建立与当地网络协议所规定的接口进行通信的实体层。它定义了如何让类似的网络接口通信,并指定当网络层出现错误时,如何进行检测和纠正。数据链路层一般包括两个子层:逻辑链路控制(LLC)和介质访问控制(MAC)。
网络层主要用于在不同网络之间进行数据传送和路由选择,通过网络地址来实现通信。主要协议有IP(Internet Protocol)协议、ICMP(Internet Control Message Protocol)协议、IGMP(Internet Group Management Protocol)协议、OSPF(Open Shortest Path First)协议等。
传输层负责对网络通信质量进行管理,可以为应用程序提供良好的数据传输服务。主要协议有TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)。
会话层主要负责建立、管理和终止会话连接,提供端到端的数据传输流控制和同步服务。主要协议有RPC(Remote Procedure Call)协议、NCP(NetWare Core Protocol)协议等。
表示层用于处理交换数据的表示方式,例如数据压缩、加密、解密等操作。主要协议有ASCII、EBCDIC、JPEG、GIF等。
应用层主要用于提供给用户的网络服务。例如:FTP(File Transfer Protocol)协议、HTTP(Hyper Text Transfer Protocol)协议、SMTP(Simple Mail Transfer Protocol)协议、SSH(Secure Shell Protocol)协议以及DNS(Domain Name System)协议等。
计算机网络的七层协议是一个分层的通讯协议体系结构,每一层都定义了不同的功能,便于开发和实现网络通讯的标准化和互操作性。各层的主要功能如下:
1.物理层(Physical Layer):传输比特流,定义能传输的电气和物理特性。
2.数据链路层(Data Link Layer):传输帧,定义帧的格式、检测和控制差错,以及媒体访问控制。
3.网络层(Network Layer):地理位置传输,实现不同网络间的路由选择和数据传输。
4.传输层(Transport Layer):端到端传输,提供可靠的传输服务,例如 TCP 协议。
5.会话层(Session Layer):建立、管理和终止会话连接,提供端到端的数据传输流控制和同步服务。
6.表示层(Presentation Layer):处理交换数据的表示方式,例如数据压缩、加密、解密等操作。
7.应用层(Application Layer):提供特定的应用服务,例如文件传输、电子邮件、Web浏览等。
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。
3、UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。
4.每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP对系统资源要求较多,UDP对系统资源要求较少。
当对网络通信质量有要求的时候,比如: 整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,如QQ,游览器, HTTP,HTTPS,FTP等传输文件的协议,POP,SITP等邮件传输的协议。
当对我拿过来通信质量要求不高的时候,要求网络通讯能尽量的快,这时就可以使用UDP,比如qq语音,qq视频FTFP
整个过程跟打电话的过程一模一样:
由于 TCP 连接是可以双向通信的(全双工),因此每个方向都必须单独进行关闭(这句话才是精辟,后面四个挥手过程都是其具体实现的语言描述)
四次挥手过程,客户端和服务端都可以先开始断开连接