网络

1.你能聊聊TCPIP四层网络模型吗?OSI七层网络模型也说一下!

设想一下,各个电脑厂商,比如IBM、苹果啥的,都弄自己的协议,结果就苹果电脑和苹果电脑自己可以通信,和IBM电脑就不可以通信,这不是尴尬么。所以搞一个国际通行的协议,大家都按照这个来,所有电脑都可以通信,不是很好么。

此时就必须搞一个标准的网络模型出来,大家都按照这个来走,大家都要遵守统一的规范。这就是所谓OSI七层模型,他们分别是:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。那么在这个基础上,又简化出了TCP/IP四层模型,数据链路层、网络层、传输层、应用层。

物理层

网线,海底电缆等都属于网络的物理层,在物质层面将两台电脑连接起来,然后传递0/1的电路信号。

数据链路层

数据链路层,物理层给各个电脑连接起来了,还传输最底层的0和1电路信号,关键不行啊,你得定义清楚哪些0和1分为一组,这些信号啥意思?这才能进行通信。所以数据链路层就干这事儿,定义一下电路信号咋分组。

00000011(从电脑1出发,要到电脑2去)

00101(从电脑1出发,要到电脑3去)

0101(从电脑2触发,要到电脑4去)

01(从电脑3出发,要到电脑5去)

很多年前,每个公司都定义自己的电路信号分组方式,但是后来出来了以太网协议,以太网。一组电信号是一个数据包,叫一个帧(frame),每个帧分成两个部分,标头(head)和数(data),标头包含一些说明性的东西,比如说发送者、接收者和数据类型之类的。

每台电脑要往另外一台电脑发送数据,一堆0/1电路信号,封装成数据包,包含头和数据,头里包含了从哪儿来到哪儿去,必须从一台电脑的一个网卡,发送到另外一个电脑的一个网卡,所以以太网发送的数据包必须得指定,目标电脑的网卡的mac地址。

以太网规定了,每个网卡必须得包含一个mac地址,mac地址就是这个网卡的唯一标识,

以太网协议规定了,接入网络里的所有设备,都得有个网卡,以太网协议里的那个数据包,在数据链路层传输的数据包,必须从一个电脑的网卡传输到另外一个电脑的网卡,而这个网卡地址就叫做所谓的mac地址。每块网卡出厂的时候,就有一个唯一的mac地址,48位的二进制,但是一般用12个16进制数字表示,前6个16进制是厂商编号,后6个16进制是网卡流水号。

windows上,ipconfig /all,看看物理地址,就是mac地址,7C-67-A2-20-AB-5C

所以在以太网里传输数据包的时候,必须指定接收者的mac地址才能传输数据。

但是以太网的数据包怎么从一个mac地址发送到另一个mac地址?这个不是精准推送的,以太网里面,如果一个电脑发个数据包出去,会广播给局域网内的所有电脑设备的网卡 ,然后每台电脑都从数据包里获取接收者的mac地址,跟自己的mac地址对比一下,如果一样,就说明这是发给自己的数据包。

但是上面这种广播的方式,仅仅针对一个子网(局域网)内的电脑,会广播,否则一个电脑不能广播数据包给全世界所有的其他电脑吧,是仅仅广播给一个子网里面的电脑的。

如下图:

网络层

上面说到,子网内的电脑,通过以太网发个数据包,对局域网内的电脑,是广播出去的。那么怎么知道哪些电脑在一个子网内呢?这就得靠网络层了,这里就有一套IP地址,IP地址就可以让我们区分哪些电脑是一个子网的。

网络层里有IP协议,IP协议定义的地址就叫做IP地址。IP地址有IPv4和IPv6两个版本,目前广泛使用的是IPv4,是32个二进制数字组成的,但是一般用4个十进制数字表示,范围从0.0.0.0到255.255.255.255之间。

每台计算机,都会分配一个ip地址,ip地址的前24位(就是前面3个十进制数字),代表了网络,后8位(就是最后1个十进制数字),代表了主机。

如果几台电脑是一个子网的,那么前面的3个十进制数字一定是一样的。举个例子,大家平时做实验,玩儿虚拟机吧,自己win上开几个linux虚拟机,你会发现,win上的ip地址可能是192.168.0.103,然后几个虚拟机的ip地址是192.168.0.182,192.168.0.125,192.168.0.106,类似这样的。

这个win机器和几个虚拟机,前面3个十进制数字都是192.168.0,就代表大家是一个子网内的,最后那个数字是这个子网的不同主机的编号。

但是实际上上面就是举个例子,其实单单从ip地址是看不出来哪些机器是一个子网的,因为从10进制是判断不出来的。需要通过ip地址的二进制来判断,结合一个概念来判断,叫做子网掩码

比如说ip地址是192.168.56.1,子网掩码是255.255.255.0。知道了子网掩码之后,如果要判断两个ip地址是不是一个子网的,就分别把两个ip地址和自己的子网掩码进行二进制的与运算,与运算之后,比较一下代表网络的那部分。

192.168.56.1和192.168.32.7,判断是不是一个子网的,拿子网掩码255.255.255.0,跟两个ip地址的二进制做与运算

11000000.10101000.00111000.00000001

11111111.11111111.11111111.00000000

子网掩码的二进制是:11111111.11111111.11111111.00000000,然后就跟ip地址的二进制做与好了,通过二进制来比较网络部分的地址是不是一模一样的。

有了网络层的ip地址之后,两台在子网内的电脑终于可以通过广播+mac地址判断来传输数据包进行通信了。

但是如果发现要接受数据包的计算机不在子网内,那么就不能通过广播来发送数据包,需要通过路由来发送数据包。

看到路由,就想到了路由器了,对了,路由器大家都熟悉吧,自己平时也会去买对吧,比如小米的路由器啥的,家里上网一般都会弄个路由器对吧,ok。路由器负责将多个子网进行连接,因为比如你在自己家里,其实你就只是你自己的一个子网,你要是访问网站啥的,是跟那个网站机器所在的子网进行通信。

每个电脑都可以搞多个网卡的,不是只有一个网卡,一般笔记本电脑都有以太网网卡和wifi网卡,发送数据包的时候要决定走哪个网卡。路由器,其实就是配置了多个网卡的一个专用设备,可以通过不同的网卡接入不同的网络。

家里的路由器是包含了交换机和路由的两个功能的,如果是连接到局域网内的设备就把线插LAN那儿;如果是连接到英特网,就把线插在WAN那儿。

这儿给大家举个例子,就是两个局域网之间,如果要是通过一个路由器进行通信的话,是怎么弄的。

大概过程就是,路由器配置了两块网卡,每个网卡可以连到一个局域网内。

局域网1内的电脑,要发送数据包到局域网2内的电脑,在数据包里写上自己的ip地址和对方的ip地址。但是他们俩不在一个局域网内,于是局域网1内的电脑,先通过交换机将数据包发送给路由器,这个过程需要将路由器的一块网卡的ip地址对应的mac地址写到数据包的头部,然后才能通过交换机广播出去,路由器接收到之后比较自己一块网卡的mac地址,就知道是来找自己的。

接着路由器接收到数据包之后,就会在局域网2内,将目标机器的ip地址对应的mac地址写入头部,接着再次通过交换机发送广播通知,发送给局域网2内的电脑。

一个局域网内的每台机器都有自己的ARP cache,这个ARP就是用来在一个局域网内让各个设备都知道每个设备的ip地址和mac地址的对应关系的,一般就是某个机器发送广播通知自己的ip地址和mac地址的对应关系,然后每个机器给他一个回应。以此类推,大家都互相这样广播一把,ip地址和mac地址的对应关系,大家不就都知道了吗?

所以大家在上面可以看到,一个子网内的机器之间通信,就是在数据包里写上对方的mac地址,然后交换机广播出去ok了;但是如果是跨子网的通信,就是写上对方的ip地址和路由器的mac地址,然后先通过mac地址广播到路由器,让路由器再根据另外一个子网的ip地址转换为mac地址,通过另外一个子网的交换机广播过去。就这个意思。

如图:

下面介绍几个概念:

  • 网关其实就是路由器的一种,运作在网络层。可以把路由器上的ip地址认为就是网关,路由器上每个网卡都有mac地址和对应的ip地址。路由器虽然有mac地址,但是不能通过mac地址寻址的,必须通过ip地址寻址,所以路由器其实是工作在网络层的设备。(电脑上有默认网关)

  • 网络交换机是通过mac地址来寻址和传输数据包的;但是路由器是通过ip地址寻址和传输数据包的。网络交换机主要用在局域网的通信,一般你架设一个局域网,里面的电脑通信是通过数据链路层发送数据包,通过mac地址来广播的,广播的时候就是通过网络交换机这个设备来把数据广播到局域网内的其他机器上去的;路由器一般用来让你连入英特网。

  • LAN,就是local area network,就是局域网;WAN,就是wide area network,就是广域网。WLAN是wireless local area network,就是无线局域网,也就是wifi,在局域网内,直接通过wifi无线联网。

假设你访问百度网站,先通过mac地址和交换机广播到默认网关,然后进行一层一层网关在寻址,一直到找到百度所在的那个服务器的ip地址和对应的mac地址(这里也用到交换机在子网的广播),然后传输数据。

传输层

上面我们大概明白了通过网络层的ip地址怎么划分出来一个一个的子网,然后在子网内部怎么通过mac地址广播通信;跨子网的时候,怎么通过ip地址 -> mac地址 -> 交换机 -> 路由器 -> ip地址 -> mac地址 -> 交换机的方式来通过路由器进行通信。

但是这里还有一个问题,就是一台机器上,是很多个程序用一个网卡进行网络通信的,比如说浏览器、QQ、视频直播,这些软件都用了一个网卡往外面发送数据,然后从网卡接收数据,对吧。

所以还需要一个端口号的概念,就是你得发送数据包到某个机器的一个网卡的某个端口上去,然后那个机器上监听那个端口的程序,就可以提取发送到这个端口的数据,知道是自己的数据。端口号是0~65536的范围内,0~1023被系统占用了,别的应用程序就用1024以上的端口就ok了。

电脑1,是在端口48362监听的,通过网卡发送了一条数据 -> 电脑2的ip地址的20386这个端口 -> 电脑2的上面的某个QQ,监听着20386的端口 -> 电脑2的网卡接收到一条数据之后,发现人家找的是20386这个端口,就去找谁哪个哥儿们在监听20386端口,QQ在监听,我就把这个网卡过来的数据,传递给QQ,通过端口知道,哪条数据是给你的

所以其实大家会发现一点,网络层,是基于ip协议,进行主机和主机间的寻址和通信的,然后传输层,其实是建立某个主机的某个端口,到另外一个主机的某个端口的连接和通信的。

这个通信,就是通过socket来实现的,通过socket就可以基于tcp/ip协议完成刚才上面说的一系列的比如基于ip地址和mac地址转换和寻址啊,通过路由器通信啊之类的,而且会建立一个端口到另外一个端口的连接。

udp和tcp都是传输层的协议,作用就是在数据包里加入端口号,可以通过端口号进行点对点的通信了。udp协议是不可靠的,发出去人家收到没有就不知道了;tcp协议是可靠的,要求三次握手,而且要求人家接收到数据必须回复你。

传输层的tcp协议,仅仅只是规定了一套基于端口的点对点的通信协议,包括如何建立连接,如何发送和读取消息,但是实际上如果你要基于tcp协议来开发,你一般是用socket,java socket网络编程。

应用层

通过传输层的tcp协议可以传输数据,但是人家收到数据之后,怎么来解释?比如说收到个邮件你怎么处理?收到个网页你怎么处理?类似这个意思,所以针对各种不同的应用,邮件、网页之类的,都是定义不同的应用层协议的。这个应用层,我们就假设综合了会话层、表示层和应用层了,3层合成1层。

电脑1走tcp协议发送了一段东西过来,发送到电脑2的20386端口

GET http://localhost:8080/ http/1.1

key:valuel

key:value

电脑2走tcp协议读取到了属于自己这个20386端口 的一段数据

GET http://localhost:8080/ http/1.1

key:valuel

key:value

发送了一段响应

200

key;value

key:value

又通过底层的tcp发了出去,电脑1的30987端口,ip

电脑1,网卡,走以太网协议收到一个数据包

200

key;value

key:value

比如最常见的,应用层的协议就是http协议,进行网络通信。

然后我们看下自己的网络设置,一般包含了ip地址、子网掩码、网关地址、DNS地址。前面3个我们其实都知道啥意思了。ip地址和子网掩码用来划分子网的,判断哪些ip地址在一个子网内。同时你的ip地址和mac地址关联起来的,唯一定位了你的网卡。网关地址,你就认为是路由器上的那个网卡的ip地址吧,路由器的网卡也有mac地址,mac地址对应了一个ip地址。

DNS地址是啥呢?Domain Name System。因为我们一般定位是通过ip地址+mac地址+端口号来定位一个通信目标的,但是如果在浏览器上输入一个www.baidu.com,咋整?这个时候是先把www.baidu.com发给DNS服务器,然后DNS服务器告诉你www.baidu.com对应的ip地址的。

2.浏览器请求www.baidu.com的全过程大概是怎么样的?

首先应该知道网络七层模型大概都是怎么回事了,然后四层模型其实就是会话层、表示层和应用层,合并为了一个应用层,同时没把物理层算在内。

并且我们也大概知道每一层的协议和作用,网络通信的时候都是怎么回事了,现在我们来看看假设通过浏览器发送一个请求,你访问到那个网站对应的机器,然后人家再给你一个响应的全过程。

现在我们先假设,我们给电脑设置了几个东西:

ip地址:192.168.31.37

子网掩码:255.255.255.0

网关地址:192.168.31.1

DNS地址:8.8.8.8

这时,我们打开一个浏览器,请求www.baidu.com地址,这个时候找DNS服务器,DNS服务器解析域名之后,返回一个ip地址,比如172.194.26.108。

接着会判断两个ip地址是不是一个子网的,用子网掩码255.255.255.0,对两个ip地址做与运算,拿到192.168.31.0和172.194.26.0,明显不是一个子网的。

如图:

那就得发送一个数据包给网关,其实你就认为是我们的路由器吧,就是192.168.31.1,而且我们是可以拿到网关ip地址的mac地址的,现在我们从应用层出发,通过浏览器访问一个网站,是走应用层的http协议的,并且要把浏览器发出的请求打包成数据包,要把哪些东西给放到数据包中去呢?

先介绍一下http协议 :




这就构成了一个http请求报文浏览器请求一个地址,先按照应用层的http协议,封装一个应用层数据包,数据包里就放了http请求报文,这个时候会将这个http请求报文打包成一个数据包,仅仅只是数据包的数据部分,此时是数据包是没有头的。上面根据http协议搞一个http请求报文,然后搞一个数据包出来,就是网络模型中到的应用层干的事儿了。

接着就是跑传输层来了,这个层是tcp协议,这个tcp协议会让你设置端口,发送方的端口随机选一个,接收方的端口一般是默认的80端口。

这个时候,会把应用层数据包给封装到tcp数据包中去,而且会加一个tcp头,这个tcp数据包是对应一个tcp头的,这个tcp头里就放了端口号信息。如图:

接着跑到网络层来了,走ip协议,这个时候会把tcp头和tcp数据包,放到ip数据包里去,然后再搞一个ip头,ip头里本机和目标机器的ip地址。

这里本机ip地址是192.168.31.37,

目标机器是172.194.26.108。

因为,通过ip协议,可以判断说,两个ip地址不是在一个子网内的,所以此时只能将数据包先通过以太网协议广播到网关上去,通过网关再给他发送出去,如图:

接着是数据链路层,这块走以太网协议,这里是把ip头和ip数据包封到以太网数据包里去,然后再加一个以太网数据包的头,头里放了本机网卡mac地址,和网关的mac地址。但是以太网数据包的限制是1500个字节,但是假设这个时候ip数据包都5000个字节了,那么需要将ip数据包切割一下。

这个时候一个以太网数据包要切割为4个数据包,每个数据包包含了以太网头、ip头和切割后的ip数据包,4个数据包的大小分别是1500,1500,1500,500。ip头里包含了每个数据包的序号。

如图:

这4个以太网数据包都会通过交换机发到你的网关上,然后你的路由器是可以联通别的子网的,这个是时候你的路由器就会转发到别的子网的可能也是某个路由器里去,然后以此类推吧,N多个路由器或者你叫网关也行,N多个网关转发之后,就会跑到百度的某台服务器,接收到4个以太网数据包。

百度服务器接收到4个以太网数据包以后,根据ip头的序号,把4个以太网数据包里的ip数据包给拼起来,就还原成一个完整的ip数据包了。接着就从ip数据包里面拿出来tcp数据包,再从tcp数据包里取出来http数据包,读取出来http数据包里的各种协议内容,接着就是做一些处理,然后再把响应结果封装成http响应报文,封装在http数据包里,再一样的过程,封装tcp数据包,封装ip数据包,封装以太网数据包,接着通过网关给发回去。

如下图:

3.画一下TCP三次握手流程图?为啥是三次而不是二次或者四次呢?

(1)tcp三次握手过程

通过传输层的tcp协议建立网络连接的时候,其实走的是三次握手的过程

建立三次握手的时候,TCP报头用到了下面几个东西,ACK、SYN、FIN。

第一次握手,客户端发送连接请求报文,此时SYN=1、ACK=0,这就是说这是个连接请求,seq=x,接着客户端处于SYN_SENT状态,等待服务器响应。

第二次握手,服务端收到SYN=1的请求报文,需要返回一个确认报文,ack=x+1,SYN=1,ACK=1,seq=y,发送给客户端,自己处于SYN_RCVD状态。

第三次握手,客户端收到了报文,将ack=y+1,ACK=1,seq=x+1

其实三次握手说白了,就是来回来去三次请求,每次请求带上一堆TCP报文头,根据报文头是否正确,就是越好的协议来建立连接。简单说就是这样。

(2)为啥不是2次或者4次握手呢?

假设两次握手就ok了,要是客户端第一次握手过去,结果卡在某个地方了,没到服务端;完了客户端再次重试发送了第一次握手过去,服务端收到了,ok了,大家来回来去,三次握手建立了连接。

结果,尴尬的是,后来那个卡在哪儿的老的第一次握手发到了服务器,服务器直接就返回一个第二次握手,这个时候服务器开辟了资源准备客户端发送数据啥的,结果呢?客户端根本就不会理踩这个发回去的二次握手,因为之前都通信过了。

但是如果是三次握手,那个二次握手发回去,客户端发现根本不对,就会发送个复位的报文过去,让服务器撤销开辟的资源,别等着了。

因为3次握手就够了,不需要4次或者5次浪费资源了。

(3)tcp断开连接的4次挥手

第一次挥手,客户端发送报文,FIN=1,seq=u,此时进入FIN-WAIT-1状态

第二次挥手,服务端收到报文,这时候进入CLOSE_WAIT状态,返回一个报文,ACK=1,ack=u+1,seq=v。客户端收到这个报文之后,直接进入FIN-WAIT-2状态,此时客户端到服务端的连接就释放了。

第三次挥手,服务端发送连接释放报文,FIN=1,ack=u+1,seq=w,服务端进入LAST-ACK状态

第四次挥手,客户端收到连接释放报文之后,发应答报文,ACK=1,ack=w+1,seq=u+1,进入TIME_WAIT状态,等待一会儿客户端进入CLOSED状态,服务端收到报文之后就进入CLOSED状态。

4.说一下http的工作流程?http1.0,http1.1,http2.0具体有哪些区别?

http 1.0要指定keep-alive来开启持久连接,默认是短连接,就是浏览器每次请求都要重新建立一次tcp连接,完事儿了就释放tcp连接。早期的网页都很low,没啥东西,就一点文字,就用这个没问题。但是现在,一个网页打开之后,还要加载大量的图片、css、js,这就坑爹了,发送多次请求。

早期,2000年之前,那个时候网页,都很low,当时你打开一个网页,就是说现场底层tcp三次握手,跟网站建立一个tcp连接,然后通过这个tcp连接,发送一次http请求,网站返回一个http响应(网页的html,里面有一大段文字),浏览器收到html渲染成网页,浏览器就走tcp四次挥手,跟网站断开连接了

到了后面,发现2000之后,2010之后更不用说了,网页发展很迅猛,一个网页包含着大量的css、js、图片等资源。比如你请求一个网页,这个网页的html先过来,过来之后,浏览器再次发起大量的请求去加载css、js、图片,打开一个网页可能浏览器要对网站服务器发送几十次请求。

http 1.0,疯了,刚开始请求网页的html,tcp三次握手建立连接 -> 请求/响应 -> tcp四次挥手断开连接,接着再次要加载css、js、图片,要发送30个请求,上面的过程来30次,30次频繁的建立tcp连接以及释放tcp连接。很慢很慢。

其实最慢的不是发送请求和获取响应,打开和释放连接,这都是很重的过程

http 1.1默认支持长连接,就是说,浏览器打开一个网页之后,底层的tcp连接就保持着,不会立马断开,之后加载css、js之类的请求,都会基于这个tcp连接来走。http 1.1还支持host头,也就可以支持虚拟主机;而且对断点续传有支持。

浏览器,第一次请求去一个网站的一个页面的时候,就会打开一个tcp连接,接着就在一段时间内都不关闭了,然后接下来这个网页加载css、js、图片大量的请求全部走同一个tcp连接,频繁的发送请求获取响应,最后过了一段时间,这些事儿都完了,然后才会去释放那一个tcp连接。大幅度的提升复杂网页的打开的速度,性能。

http 2.0,支持多路复用,基于一个tcp连接并行发送多个请求以及接收响应,解决了http 1.1对同一时间同一个域名的请求有限制的问题。二进制分帧,将传输数据拆分为更小的帧(数据包),frame(数据包,帧),提高了性能,实现低延迟高吞吐。

5.聊聊https的工作原理?为啥用https就可以加密通信?

http协议都是明文的,是没有加密的,所以其实现在一般大部分应用都是用https协议的。之前是基于SSL协议对http进行加密,后来又升级到了TSL协议来加密,现在称之为SSL / TSL吧。
HTTP 的不足之处

  • 通信内容使用明文——内容可能被窃听
  • 不验证通信方的身份——可能遭遇伪装
  • 无法验证报文的完整性——报文有可能已遭篡改
    HTTPS = HTTP + 加密 + 认证 + 数字签名 解决上述的三个问题

注意:秘钥如果没用在路径上传递,只是保存在服务器和客户端上是没有安全问题的,因为黑客都是从通信的路径上截获消息,然后破解的。如果不在路径上发送,就会是安全的。

https的工作原理大概是这样的:

(1)浏览器把自己支持的加密规则发送给网站

(2)网站从这套加密规则里选出来一套加密算法和hash算法,然后把自己的身份信息用证书的方式发回给浏览器,证书里有网站地址、加密公钥、证书颁发机构(hash算法用来保证验证消息是否没有被篡改,专业术语叫做 数字签名

(3)浏览器验证证书的合法性,然后浏览器地址栏上会出现一把小锁;浏览器接着生成一串随机数密码,然后用证书里的公钥进行加密,这块走的非对称加密;用约定好的hash算法生成握手消息的hash值,然后用密码对消息进行加密,然后把所有东西都发给网站,这块走的是对称加密。这里的总的消息分成三部分,用公钥加密的随机密码,消息的hash值,和用随机密码加密的消息

(4)网站,从消息里面可以取出来公钥加密后的随机密码,用本地的私钥对消息解密取出来密码,然后用密码解密浏览器发来的握手消息,计算消息的hash值,并验证与浏览器发送过来的hash值是否一致,最后用密码加密一段握手消息,发给浏览器

(5)浏览器解密握手消息,然后计算消息的hash值,如果跟网站发来的hash一样,握手就结束,之后所有的数据都会由之前浏览器生成的随机密码,然后用对称加密来进行进行加密。

常用的非对称加密是RSA算法,对称加密是AES、RC4等,hash算法就是MD5

非对称加密,有个人说我加密的时候是用了一个公钥去加密,然后你解密的时候是用私钥去解密;我加密的时候用的算法,跟解密的时候用的算法,是一样的,对称加密。

6.什么是长连接?http长连接是什么?

http本身没什么所谓的长连接短连接之说,其实说白了都是http下层的tcp连接是长连接还是短连接,tcp连接保持长连接,那么多个http请求和响应都可以通过一个链接来走。其实http 1.1之后,默认都是走长连接了,就是底层都是一个网页一个tcp连接,一个网页的所有图片、css、js的资源加载,都走底层一个tcp连接,来多次http请求即可。

http 1.0的时候,底层的tcp是短连接,一个网页发起的请求,每个请求都是先tcp三次握手,然后发送请求,获取响应,然后tcp四次挥手断开连接;每个请求,都会先连接再断开。短连接,建立连接之后,发送个请求,直接连接就给断开了

http 1.1,tcp长连接,tcp三次握手,建立了连接,无论有多少次请求都是走一个tcp连接的,走了n多次请求之后,然后tcp连接被释放掉了

7.聊聊Socket的工作原理?Socket跟TCP IP之间是啥关系?

其实不知道大家发现没有,网络相关的问题,都是围绕着所谓的七层模型,或者是四层模型去走的。聊完四层模型,接着就是一次请求的全过程,紧接着就是聊传输层的tcp的连接,然后就是传输层的tcp协议之上的socket编程,接下来还会聊聊应用层的http协议。

其实说白了,socket就是在传输层里把tcp/ip协议给封装了一下,我们程序员一般都是面向socket来编程的,比如java原生就支持socket网络编程的。

大体来说这个步骤,就是我们搞一个ServerSocket无限等待别人来连接你,然后某个机器要跟你连接,就在本地创建一个socket去连接你,然后建立连接之后,在服务器上,ServerSocket也会创建出来一个socket的。通过客户端的socket跟服务端的socket进行通信,我给你写数据,你读数据,你给我写数据,我读数据,就这个过程。

当然这个底层,比如建立连接和释放连接,都是基于tcp三次握手和四次挥手的规范来搞的,包括基于tcp协议传输数据,其实就跟我们之前说的一样,都是封装个tcp数据包,里面有tcp报头,整了端口号啥的,然后封装在ip数据包里,最后封在以太网数据包里传递。

8.进程间通信?线程间切换?

进程间的通信有很多种方式,比如说:管道(pipe)、命名管道(fifo)、消息队列,共享内存(System V)

一个进程的多个线程间切换的时候就涉及到了上下文切换,这个东西说复杂了就很复杂,但是简单来说,就是有一个时间片算法,cpu给每个线程一个时间片来执行,时间片结束之后,就保存这个线程的状态,然后切换到下一个线程去执行,这就是所谓多线程并发执行的原理,就是多个线程来回来去切换,每个线程就一个时间片里执行。

posted @ 2021-04-26 21:30  双城孙宇  阅读(138)  评论(0)    收藏  举报