程序员面试必问系列之计算机网络(二)

本文涉及的产品
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
简介: 程序员面试必问系列之计算机网络(二)

7.传输层


传输层协议:

TCP(Transmission Control Protocol,传输控制协议)

UDP(User Datagram Protocol,用户数据报协议)


端口号

image.gif24.jpg


7.1 TCP


TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,其传输的单位是报文段。


TCP特点:


a.面向连接

b.只能点对点(一对一)通信

c.可靠交互

d.全双工通信

e.面向字节流


TCP如何保证可靠传输?


a.确认和超时重传

b.数据合理分片和排序

c.流量控制

d.拥塞控制

e.数据校验


TCP报文结构

image.gif23.jpg

TCP首部


image.gif22.jpg


TCP:状态控制码(Code,Control Flag),占 6 比特,含义如下:


URG:紧急比特(Urgent),当 URG=1 时,表明紧急指针字段有效,代表该封包为紧急封包。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据), 且上图中的 Urgent Pointer 字段也会被启用。

ACK:确认比特(Acknowledge)。只有当 ACK=1 时确认号字段才有效,代表这个封包为确认封包。当 ACK=0 时,确认号无效。

PSH:(Push function)若为 1 时,代表要求对方立即传送缓冲区内的其他对应封包,而无需等缓冲满了才送。

RST:复位比特(Reset),当 RST=1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。

SYN:同步比特(Synchronous),SYN 置为 1,就表示这是一个连接请求或连接接受报文,通常带有 SYN 标志的封包表示『主动』要连接到对方的意思。

FIN:终止比特(Final),用来释放一个连接。当 FIN=1 时,表明此报文段的发送端的数据已发送完毕,并要求释放传输连接。


7.2 UDP


UDP是 OSI(Open System Interconnection 开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,其传输的单位是用户数据报。


UDP特点:


a.无连接

b.尽最大努力交付

c.面向报文

d.没有拥塞控制

e.支持一对一、一对多、多对多的交互通信

e.首部开销小


UDP报文结构:


21.jpgimage.gif

UDP首部

20.jpgimage.gif


7.3 TCP与UDP的区别


(1).TCP面向连接、UDP是无连接的;

(2).TCP提供可靠的服务、也就是说,通过TCP连接传输的数据是无差错、不丢失、不重复且按序到达;UDP尽最大努力交付,即不保证可靠交付

(3).TCP的逻辑通信信息是全双工的可靠信息;UDP则是不可靠信息

(4).每一条TCP连接只能是点对点的;UDP支持一对多、多对一、多对多的交互通信(5).TCP面向字节流(可能会出现黏包问题),实际上是TCP白数据看成一连串无结构的字节流;UDP是面向报文的(不会出现黏包问题)

(6).UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)

(7).TCP首部开销20字节;UDP的首部开销小,只有8字节


7.4 TCP的黏包问题


出现黏包问题的原因:TCP 是一个基于字节流的传输服务(UDP 基于报文的),“流” 意味着 TCP 所传输的数据是没有边界的,所以可能会出现两个数据包黏在一起的情况。


解决方法:


a.发送定长包。如果每个消息的大小都是一样的,那么在接收对等方只要累计接收数据,直到数据等于一个定长的数值就将它作为一个消息。

b.包头加上包体长度。包头是定长的 4 个字节,说明了包体的长度。接收对等方先接收包头长度,依据包头长度来接收包体。

c.在数据包之间设置边界,如添加特殊符号 \r\n 标记。FTP 协议正是这么做的。但问题在于如果数据正文中也含有 \r\n,则会误判为消息的边界。

d.使用更加复杂的应用层协议


7.5 TCP流量控制


流量控制的概念:让发送方的发送速率不要太快,要让接收方来得及接收。


具体方法:利用可变窗口方法对流量进行控制如果发送方把数据发送得过快,接收方可能会来不及接收,这就会造成数据的丢失。所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。设A向B发送数据,在连接建立时,B告诉了A:“我的接收窗口是rwnd=400 ”(这里的 rwnd 表示 receiver window) 。因此,发送方的发送窗口不能超过接收方给出的接收窗口的数值。请注意,TCP的窗口单位是字节,不是报文段。TCP连接建立时的窗口协商过程在图中没有显示出来。再设每一个报文段为100字节长,而数据报文段序号的初始值设为1。大写ACK表示首部中的确认位ACK,小写ack表示确认字段的值ack。


从图中可以看出,B进行了三次流量控制。第一次把窗口减少到rwnd=300 ,第二次又减到了rwnd=100 ,最后减到rwnd=0 ,即不允许发送方再发送数据了。这种使发送方暂停发送的状态将持续到主机B重新发出一个新的窗口值为止。B向A发送的三个报文段都设置了ACK=1 ,只有在ACK=1时确认号字段才有意义。TCP为每一个连接设有一个持续计时器(persistence timer)。只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。若持续计时器设置的时间到期,就发送一个零窗口控测报文段(携1字节的数据),那么收到这个报文段的一方就重新设置持续计时器。

19.jpg


7.6 TCP拥塞控制

拥塞控制的概念:拥塞控制就是防止过多的数据注入到网络中,可以使网络中的路由器或链路不致过载。


解决方法:发送方维持一个拥塞窗口 cwnd(congestion window)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞。发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。


(1).慢启动(slow-start):当主机开始发送数据时,如果立即所大量数据字节注入到网络,那么就有可能引起网络拥塞,因为现在并不清楚网络的负荷情况。因此,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是说,由小到大逐渐增大拥塞窗口数值。通常在刚刚开始发送报文段时,先把拥塞窗口 cwnd 设置为一个最大报文段MSS的数值。而在每收到一个对新的报文段的确认后,把拥塞窗口增加至多一个MSS的数值。用这样的方法逐步增大发送方的拥塞窗口cwnd ,可以使分组注入到网络的速率更加合理。每经过一个传输轮次,拥塞窗口 cwnd 就加倍。一个传输轮次所经历的时间其实就是往返时间RTT。不过“传输轮次”更加强调:把拥塞窗口cwnd所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个字节的确认。另外,慢开始的“慢”并不是指cwnd的增长速率慢,而是指在TCP开始发送报文段时先设置cwnd=1,使得发送方在开始时只发送一个报文段(目的是试探一下网络的拥塞情况),然后再逐渐增大cwnd。为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量(如何设置ssthresh)。慢开始门限ssthresh的用法如下:


 a.当 cwnd < ssthresh 时,使用上述的慢开始算法。

 b.当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。

 c.当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞控制避免算法。


(2).拥塞避免(congestion avoidance ):让拥塞窗口cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样拥塞窗口cwnd按线性规律缓慢增长,比慢开始算法的拥塞窗口增长速率缓慢得多。无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认),就要把慢开始门限ssthresh设置为出现拥塞时的发送方窗口值的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。如下图,用具体数值说明了上述拥塞控制的过程。现在发送窗口的大小和拥塞窗口一样大。


a.当TCP连接进行初始化时,把拥塞窗口cwnd置为1。前面已说过,为了便于理解,图中的窗口单位不使用字节而使用报文段的个数。慢开始门限的初始值设置为16个报文段,即 cwnd = 16 。


b.在执行慢开始算法时,拥塞窗口 cwnd 的初始值为1。以后发送方每收到一个对新报文段的确认ACK,就把拥塞窗口值另1,然后开始下一轮的传输(图中横坐标为传输轮次)。因此拥塞窗口cwnd随着传输轮次按指数规律增长。当拥塞窗口cwnd增长到慢开始门限值ssthresh时(即当cwnd=16时),就改为执行拥塞控制算法,拥塞窗口按线性规律增长。


c.假定拥塞窗口的数值增长到24时,网络出现超时(这很可能就是网络发生拥塞了)。更新后的ssthresh值变为12(即变为出现超时时的拥塞窗口数值24的一半),拥塞窗口再重新设置为1,并执行慢开始算法。当cwnd=ssthresh=12时改为执行拥塞避免算法,拥塞窗口按线性规律增长,每经过一个往返时间增加一个MSS的大小。强调:“拥塞避免”并非指完全能够避免了拥塞。利用以上的措施要完全避免网络拥塞还是不可能的。“拥塞避免”是说在拥塞避免阶段将拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。


(3).快重传(fast retransmit):如果发送方设置的超时计时器时限已到但还没有收到确认,那么很可能是网络出现了拥塞,致使报文段在网络中的某处被丢弃。这时,TCP马上把拥塞窗口 cwnd 减小到1,并执行慢开始算法,同时把慢开始门限值ssthresh减半。这是不使用快重传的情况。快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方)而不要等到自己发送数据时才进行捎带确认。接收方收到了M1和M2后都分别发出了确认。现在假定接收方没有收到M3但接着收到了M4。显然,接收方不能确认M4,因为M4是收到的失序报文段。根据可靠传输原理,接收方可以什么都不做,也可以在适当时机发送一次对M2的确认。但按照快重传算法的规定,接收方应及时发送对M2的重复确认,这样做可以让发送方及早知道报文段M3没有到达接收方。发送方接着发送了M5和M6。接收方收到这两个报文后,也还要再次发出对M2的重复确认。这样,发送方共收到了接收方的四个对M2的确认,其中后三个都是重复确认。快重传算法还规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段M3,而不必继续等待M3设置的重传计时器到期。由于发送方尽早重传未被确认的报文段,因此采用快重传后可以使整个网络吞吐量提高约20%。


(4).快恢复(fast recovery):


a.当发送方连续收到三个重复确认,就执行“乘法减小”算法,把慢开始门限ssthresh减半。这是为了预防网络发生拥塞。请注意:接下去不执行慢开始算法。

b.由于发送方现在认为网络很可能没有发生拥塞,因此与慢开始不同之处是现在不执行慢开始算法(即拥塞窗口cwnd现在不设置为1),而是把cwnd值设置为慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。

16.jpg

image.gif

17.jpg


18.jpg

image.gif

image.gif

7.7 TCP传输连接管理[重点]


(1).TCP建立连接:三次握手


15.jpgimage.gif


TCP建立连接全过程详细过程:


a.B的TCP服务器进程首先创建传输控制块TCB,准备接受客户进程的连接请求。然后服务器进程就处于LISTEN(收听)状态,等待客户的连接请求。如有,就作出响应。
b.A的TCP客户进程也是首先创建传输控制模块TCB,然后向B发出连接请求报文段,这时首部中的同步位SYN=1,同时选择一个初始序号seq=x。TCP规定,SYN报文段(即SYN=1的报文段)不能携带数据,但是要消耗一个序号。这时,TCP客户进程进入SYN-SENT(同步已发送)状态。

c.B收到连接请求报文段后,如同意建立连接,则向A发送确认。在确认报文段中应把SYN和ACK位都置1,确认号是ack=x+1,同时也为自己选择一个初始序号seq=y。注意:这个报文段也不能携带数据,但同样要消耗一个序号。这时TCP服务器进程进入SYN-RECV(同步收到)状态。

d.TCP客户进程收到B的确认后,还要向B给出确认。确认报文段的ACK置1,确认号ack=y+1,而自己的序号seq=x+1。TCP标准规定,ACK报文段可以携带数据。但如果不携带数据则不消耗序号。在这种情况下,下一个数据报文段的序号仍然是seq=x+1。这时,TCP的连接已经建立,A进入ESTABLISHED(已建立连接)状态。当B接收到A的确认后,B也进入ESTABLISHED(已建立连接)状态。


Q1:TCP为什么要进行三次握手?


a.因为信道不可靠,而 TCP 想在不可靠信道上建立可靠地传输,那么三次通信是理论上的最小值。(而 UDP 则不需建立可靠传输,因此 UDP 不需要三次握手)

b.因为双方都需要确认对方收到了自己发送的序列号,确认过程最少要进行三次通信;

c.为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误


(2).TCP断开连接:四次挥手

image.gif

14.jpg

TCP 断开连接全过程详细解释:


a.A和B都处于ESTABLISHED状态,A的应用进程首先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。A把连接释放报文段首部的FIN置1,其序列号seq=u,它等于前面已经传送过的数据的最后一个字节的序号加1。这时,A进入FIN-WAIT-1(终止等待1)状态,等待B的确认。注意:TCP规定:FIN报文段即使不携带数据,它也会消耗一个序号。

b.B收到连接释放报文段后即发出确认,确认号是ack=u+1,而这个报文段自己的序号是v,等待B前面已经传送过的数据的最后一个字节的序号加1。然后B就进入CLOSE-WAIT(关闭等待)状态。TCP服务器进程这时应通知高层应用进程,因而从A到B这个方向的连接就释放了,这时的TCP连接处于半关闭状态,即A已经没有数据要发送了,但B若发送数据,A仍要接收。也就是说,从B到A这个方向的连接并没有关闭,这个连接可能会持续一段时间。

c.A收到来自B的确认后,就进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。如果B已经没有要向A发送的数据,其应用进程就会通知TCP释放连接。这时B发出的连接释放报文段必须使FIN=1。现假定B的序号为w(在半关闭状态B可能又发送了一些数据)。B还必须重复上次已经发送过的确认号ack=u+1。这时,B就进入LAST-ACK(最后确认状态),等待A的确认。

d.A在收到B的释放连接报文段后,必须对此发出一个确认。在确认报文段中把ACK置1,确认号ack=w+1,而自己的序号是seq=u+1(根据TCP标准,前面发送过的FIN报文段要消耗一个序号)。然后经过时间等待计时器(TIME-WAIT)设置的时间2MSL后,A才进入到CLOSED状态。时间MSL叫做最长报文段寿命。


Q2:TCP 为什么要进行四次挥手?


因为 TCP 是全双工模式,客户端请求关闭连接后,客户端向服务端的连接关闭(第一和第二次挥手),服务端继续传输之前没传完的数据给客户端(数据传输),服务端向客户端的连接关闭(三和第四次挥手)。所以 TCP 释放连接时服务器的 ACK 和 FIN 是分开发送的(中间隔着数据传输),而 TCP 建立连接时服务器的 ACK 和 SYN 是一起发送的(第二次握手),所以 TCP 建立连接需要三次,而释放连接则需要四次。


Q3:为什么 TCP 建立连接时可以 ACK 和 SYN 一起发送,而断开连接时则 ACK 和 FIN 分开发送呢?(ACK 和 FIN 分开是指第二次和第三次挥手)


因为客户端请求释放时,服务器可能还有数据需要传输给客户端,因此服务端要先响应客户端 FIN 请求(服务端发送 ACK),然后数据传输,传输完成后,服务端再提出 FIN 请求(服务端发送 FIN);而连接时则没有中间的数据传输,因此连接时可以 ACK 和 SYN 一起发送。


Q4:为什么客户端断开连接时,最后需要 TIME-WAIT 等待 2MSL 呢?


a.为了保证客户端发送的最后一个 ACK 报文能够到达服务端。若未成功到达,则服务端超时重传 FIN+ACK 报文段,客户端再重传 ACK,并重新计时。

b.防止已失效的连接请求报文段出现在本连接中。TIME-WAIT 持续 2MSL 可使本连接持续的时间内所产生的所有报文段都从网络中消失,这样可使下次连接中不会出现旧的连接报文段。


8.应用层


8.1 DNS(Domain Name System,域名系统)

域名的产生的原因:我们可以通过IP地址去访问网站,但是对大多数用户来说,访问每个网站都需要记住一串数字是不现实的,所以用户可以通过域名来访问网站。域名,其实是具有一定含义的字符组合。域名系统是因特网上作为域名和IP地址相互映射的一个分布式数据库,能让用户更方便使用互联网


DNS劫持:指用户访问一个被标记的地址时,DNS服务器故意将此地址指向一个错误的IP地址的行为。范例:收到各种推送广告等网站。


DNS污染:指的是用户访问一个地址,国内的服务器(非DNS)监控到用户访问的已经被标记地址时,服务器伪装成DNS服务器向用户发回错误的地址的行为。比如不能访问Google、YouTube等。


DNS是互联网的一项服务。它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS 使用 TCP 和 UDP 端口 53。当前,对于每一级域名长度的限制是 63 个字符,域名总长度则不能超过 253 个字符。


域名 ::= {<三级域名>.<二级域名>.<顶级域名>},如:blog.huihut.com


8.2 FTP(File Transfer Protocol,文件传输协议)


FTP是用于在网络上进行文件传输的一套标准协议,使用客户/服务器模式,使用 TCP 数据报,提供交互式访问,双向传输。TFTP(Trivial File Transfer Protocol,简单文件传输协议)一个小且易实现的文件传输协议,也使用客户-服务器方式,使用UDP数据报,只支持文件传输而不支持交互,没有列目录,不能对用户进行身份鉴定


8.3 TELNET


TELNET 协议是 TCP/IP 协议族中的一员,是 Internet 远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。


8.4 HTTP(HyperText Transfer Protocol,超文本传输协议)


概念:HTTP(HyperText Transfer Protocol,超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP 是万维网的数据通信的基础。


请求方法:


13.jpgimage.gif


状态码:


1xx:表示通知信息,如请求收到了或正在进行处理


    100 Continue:继续,客户端应继续其请求

    101 Switching Protocols 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到 HTTP 的新版本协议。


2xx:表示成功,如接收或知道了


      200 OK: 请求成功


3xx:表示重定向,如要完成请求还必须采取进一步的行动


      301: 永久重定向。请求的资源已被永久的移动到新 URL,返回信息会包括新的 URL,浏览器会自动定向到新 URL。今后任何新的请求都应使用新的 URL 代替。

      302:临性重定向,即以后还可能有变化


4xx:表示客户的差错,如请求中有错误的语法或不能完成


     400 Bad Request: 客户端请求的语法错误,服务器无法理解。

     401 Unauthorized: 请求要求用户的身份认证

     403 Forbidden: 服务器理解请求客户端的请求,但是拒绝执行此请求

     404 Not Found: 服务器无法根据客户端的请求找到资源(网页)

     408 Request Timeout: 服务器等待客户端发送的请求时间过长,超时


5xx:表示服务器的差错,如服务器失效无法完成请求


    500 Internal Server Error: 服务器内部错误,无法完成请求

    503 Service Unavailable: 由于超载或系统维护,服务器暂时的无法处理客户端的请求。

    504 Gateway Timeout: 充当网关或代理的服务器,未及时从远端服务器获取请求


GET方法与POST方法的区别:


a.get重点在从服务器上获取资源,post重点在向服务器发送数据;

b.get传输数据是通过URL请求,以field(字段)= value的形式,置于URL后,并用"?"连接,多个请求数据间用"&"连接,如http://127.0.0.1/Test/login.action?name=admin&password=admin,这个过程用户是可见的;post传输数据通过Http的post机制,将字段与对应值封存在请求实体中发送给服务器,这个过程对用户是不可见的;

c.get传输的数据量小,因为受URL长度限制,但效率较高;post可以传输大量数据,所以上传文件时只能用post方式;

d.get是不安全的,因为URL是可见的,可能会泄露私密信息,如密码等;post较get安全性较高;

e.get方式只能支持ASCII字符,向服务器传的中文字符可能会乱码。post支持标准字符集,可以正确传递中文字符。


Http2.0与Http1.0的区别:


(1).Http2.0采用二进制格式非文本格式;

(2).Http2.0是完全多路复用的,非有序并阻塞的只需要一个连接即可实现并行;

(3).使用报头压缩,降低了开销;

(4).Http2.0让服务器可以将响应主动推送到客户端缓存中。


8.5 SMTP(简单邮件传输协议)


SMTP是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。它是在 Internet 传输 Email 的标准,是一个相对简单的基于文本的协议。在其之上指定了一条消息的一个或多个接收者(在大多数情况下被确认是存在的),然后消息文本会被传输。可以很简单地通过 Telnet 程序来测试一个 SMTP 服务器,SMTP 使用 TCP 端口 25。


8.6 DHCP(Dynamic Host Configuration Protocol,动态主机设置协议)


DHCP是一个局域网的网络协议,使用 UDP 协议工作,主要有两个用途:


a.用于内部网络或网络服务供应商自动分配 IP 地址给用户

b.用于内部网络管理员作为对所有电脑作中央管理的手段


9.当你输入一个网址/点击一个链接,发生了什么?(www.baidu.com为例)


(1).点击网址后,应用层的DNS协议会将网址解析为IP地址;


DNS查找过程:浏览器会检查缓存中有没有这个域名对应的解析过的IP地址,如果缓存中有,这个解析过程就将结束。如果用户的浏览器缓存中没有,浏览器会查找操作系统缓存(hosts文件)中是否有这个域名对应的DNS解析结果。若还没有,此时会发送一个数据包给DNS服务器,DNS服务器找到后将解析所得IP地址返回给用户。


(2).在应用层,浏览器会给web服务器发送一个HTTP请求。请求头为:GET http://www.baidu.com/HTTP/1.1


(3).在传输层,(上层的传输数据流分段)HTTP数据包会嵌入在TCP报文段中;


TCP报文段需要设置端口,接收方(百度)的HTTP端口默认是80,本机的端口是一个1024-65535之间的随机整数,这里假设为1025,这样TCP报文段由TCP首部(包含发送方和接收方的端口信息)+ HTTP数据包组。


(4).在网络层中,TCP报文段再嵌入IP数据包中;


IP数据包需要知道双方的IP地址,本机IP地址假定为192.168.1.5,接受方IP地址为220.181.111.147(百度),这样IP数据包由IP头部(IP地址信息)+TCP报文段组成。


(5).在网络接口层,IP数据包嵌入到数据帧(以太网数据包)中在网络上传送;


数据帧中包含源MAC地址和目的MAC地址(通过ARP地址解析协议得到的)。这样数据帧由头部(MAC地址)+IP数据包组成。


(6).数据包经过多个网关的转发到达百度服务器,请求对应端口的服务;


服务接收到发送过来的以太网数据包开始解析请求信息,从以太网数据包中提取IP数据包—>TCP报文段—>HTTP数据包,并组装为有效数据交与对应线程池中分配的线程进行处理,在这个过程中,生成相应request、response。


(7).请求处理完成之后,服务器发回一个HTTP响应;


请求处理程序会阅读请求及它的参数和cookies。它会读取也可能更新一些数据,并将数据存储在服务器上。处理完毕后,数据通过response对象给客户输出信息,输出信息也需要拼接HTTP协议头部分,关闭后断开连接。断开后,服务器端自动注销request、response对象,并将释放对应线程的使用标识(一般一个请求单独由一个线程处理,部分特殊情况有一个线程处理多个请求的情况)。响应头为:HTTP/1.1200 OK。


(8).浏览器以同样的过程读取到HTTP响应的内容(HTTP响应数据包),然后浏览器对接收到的HTML页面进行解析,把网页显示出来呈现给用户。


客户端接收到返回数据,去掉对应头信息,形成也可以被浏览器认识的页面HTML字符串信息,交与浏览器翻译为对应页面规则信息展示为页面内容。


10.MAC地址(物理地址、硬件地址)的概念和作用


概念:MAC地址就是在媒体接入层上使用的地址,也叫物理地址、硬件地址或链路地址,其被固化在适配器的ROM中。可见,MAC地址实际上就是适配器地址或适配器标识符。当某台计算机使用某块适配器后,适配器上的标识符就成为该计算机的MAC地址。MAC地址长度为6字节(48比特),由IEEE的注册管理结构RA进行管理分配。


作用:MAC地址是计算机的唯一标识,在数据链路层中,交换机通过识别MAC地址进行数据包的传输。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
1月前
|
负载均衡 算法 应用服务中间件
面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
字节跳动面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
40 0
|
3月前
|
网络协议 网络性能优化 C++
C/C++工程师面试题(网络编程篇)
C/C++工程师面试题(网络编程篇)
49 0
|
4月前
|
存储 算法 程序员
【Leetcode 程序员面试金典 01.01】判定字符是否唯一 —— 位运算|哈希表
可以使用哈希表或位运算来解决此问题:由题可知s[i]仅包含小写字母,int[26]即能表示字符的出现次数;
|
4月前
|
算法 程序员 索引
【Leetcode 程序员面试金典 02.08】 —— 环路检测 |双指针
我们可以使用双指针解决本题,由数学推导可知:a 的距离为(环长度的倍数 - b),即 tmp 指针从头节点走到环开头节点等于 slow 指针走到环开头节点的距离
|
4月前
|
Java 程序员
【Leetcode 程序员面试金典 05.01】插入 —— 位运算
位运算问题,只需要把 N 的 i 到 j 位都置 0 后再和 M 左移 i 位的结果进行按位或即可
|
4月前
|
算法 架构师 安全
10年Java面试总结:Java程序员面试必备的面试技巧
作为一名资深10年Java技术专家,我参与了无数次的面试,无论是作为面试者还是面试官。在这里,我将分享我的一些面试经历和面试技巧,希望能帮助即将面临面试的Java程序员们。回顾我的Java职业生涯,我清晰地记得一次特别的面试经历。那是我申请一家知名科技公司的Java开发岗位。为了这次面试,我花了几周的时间准备,这不仅包括Java的基础和高级知识,还有关于公司产品的研究。
158 0
|
3天前
|
缓存 网络协议 安全
经典计算机网络面试题
经典计算机网络面试题
8 0
|
3月前
|
运维 算法 程序员
程序员去国企:长城资产IT岗位秋招面试记录
【2月更文挑战第7天】本文介绍2024届秋招中,中国长城资产管理股份有限公司的信息技术岗岗位一面的面试基本情况、提问问题等~
|
3月前
|
缓存 网络协议 安全
计算机网络 经典面试题
计算机网络 经典面试题
233 1
|
4月前
|
SQL 缓存 Java
程序员的30大Mybatis面试问题及答案
程序员的30大Mybatis面试问题及答案