网络编程知识点梳理(很好的总结)

网络编程知识点梳理(很好的总结)

2023年6月28日发(作者:)

⽹络编程知识点梳理(很好的总结)⽹络编程知识点梳理1、 你怎么理解HTTP协议?HTTP协议的特点:

(1)HTTP协议是⽆状态的

就是说每次HTTP请求都是独⽴的,任何两个请求之间没有什么必然的联系。但是在实际应⽤当中并不是完全这样的,引⼊了Cookie和Session机制来关联请求。

(2)多次HTTP请求

在客户端请求⽹页时多数情况下并不是⼀次请求就能成功的,服务端⾸先是响应HTML页⾯,然后浏览器收到响应之后发现HTML页⾯还引⽤了其他的资源,例如,CSS,JS⽂件,图⽚等等,还会⾃动发送HTTP请求这些需要的资源。现在的HTTP版本⽀持管道机制,可以同时请求和响应多个请求,⼤⼤提⾼了效率。

(3)基于TCP协议

HTTP协议⽬的是规定客户端和服务端数据传输的格式和数据交互⾏为,并不负责数据传输的细节。底层是基于TCP实现的。现在使⽤的版本当中是默认持久连接的,也就是多次HTTP请求使⽤⼀个TCP连接。HTTP报⽂

HTTP报⽂分为请求报⽂和响应报⽂

报⽂由三个部分组成,即开始⾏、⾸部⾏和实体主体

(1)请求报⽂

请求报⽂的开始⾏就是请求⾏,所以请求报⽂就是由请求⾏、请求头、内容实体组成的,注意,每⼀⾏的末尾都有回车和换⾏,在内容实体和请求头之间另有⼀个空⾏。其中请求⾏指定的是请求⽅法、请求URL、协议版本;请求头是键值对的形式存在的,就是字段名:值;内容实体就是要传输的数据。来⾃百度⾸页的请求报⽂的例⼦:

请求头中的字段说明:字段名

Host说明请求⽅法HTTP版本号指定请求的服务器的域名和端⼝号例⼦GETHTTP/1.1Host:字段名Connection说明表⽰是否需要持久连接(HTTP1.1默认为长连接)Connection:keep-alive(长连接),close(短连例⼦接)Cache-Control:max-age=0 或者 no-cacheUser-Agent: Mozilla/5.0 (Linux; X11)Accept:text/htmlAccept-Encoding:gzip, deflate, brCache-ControlUser-AgentAcceptAccept-EncodingAccept-Language指定请求和响应遵循的缓存机制发出请求的⽤户信息(⼀般是浏览器的信息)指定客户端能够接收的内容类型指定浏览器可以⽀持的web服务器返回内容压缩编码类型浏览器可接受的语⾔Accept-Language:zh-CN,zhCookieHTTP请求发送时,会把保存在该请求域名下的所有cookie值⼀起发送给web服务器Cookie: $Version=1; Skin=new;(2)响应报⽂:

响应报⽂由状态⾏、响应⾸部字段(响应头)、响应实体组成,其中第⼀⾏是状态⾏,依次包含HTTP版本,状态码和状态短语组成;在⼀个回车换⾏之后是响应头,也是键值对的形式,字段名:值;然后会有⼀个空⾏也包含回车换⾏,之后是响应实体,就是要传输的数据。来⾃百度⾸页的响应报⽂的例⼦

响应头中的字段说明:字段名

Cache-ControlConnectionContent-EncodingDateExpiresServerSet-CookieVaryTransfer-Encoding说明HTTP版本号HTTP状态码告诉所有的缓存机制是否可以缓存那种类型表⽰是否需要持久连接(HTTP1.1默认为长连接)web服务器⽀持的返回内容压缩编码类型原始服务器消息发出的时间响应过期的⽇期和时间web服务器软件名称设置Http Cookie告诉下游代理是使⽤缓存响应还是从原始服务器请求⽂件传输编码例⼦HTTP/1.1200 okCache-Control:privateConnection:keep-alive(长连接),close(短连接)Content-Encoding:gzipDate: Sat, 05 Aug 2017 12:26:36 GMTExpires: Sat, 05 Aug 2017 12:26:49 GMTBWS/1.1Set-Cookie:BDSVRTM=0;path=/Vary: Accept-EncodingTransfer-Encoding:chunkedHTTP请求⽅法

请求⽅法是客户端⽤来告知服务器其动作意图的⽅法。需要注意的是⽅法名区分⼤⼩写,需要⽤⼤写字母。

(1)GET:获取资源

向特定的资源发出请求。注意:GET⽅法不应当被⽤来产⽣“副作⽤”的操作中,例如在we app中的应⽤,其中⼀个原因是GET可能会被爬⾍等随意访问。

(2)POST:传输实体主体

向指定资源提交数据进⾏处理请求(例如提交表单或者上传⽂件)。数据被包含在请求体中。POST请求可能会导致新的资源的建⽴或对已有资源的修改。POST与GET的区别之⼀就是⽬的不同。GET的⽬的是获取,POST的⽬的是传输。

(3)PUT:传输主体

PUT⽅法⽤来传输⽂件,向指定资源位置上传其最新内容。类似FTP协议,⽂件内容包含在请求报⽂的实体中,然后请求保存到URL指定的服务器位置。

(4)HEAD:获得报⽂⾸部

HEAD⽅法类似GET⽅法,但是不同的是HEAD⽅法不要求返回数据(响应体)。这⼀⽅法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。该⽅法常⽤于测试超链接的有效性,是否可以访问,以及最近是否更新等信息。

(5)DELETE:删除⽂件

DELETE⽅法⽤来删除⽂件,是与PUT相反的⽅法。DELETE要求服务器删除Request-URI所标识的资源。

(6)OPTIONS:询问⽀持的⽅法

因为并不是所有的服务器都⽀持规定的⽅法,为了安全有些服务器可能会禁⽌掉⼀些⽅法例如DELETE、PUT等。那么OPTIONS就是⽤来询问服务器⽀持的⽅法。

(7)TRACE:追踪路径

TRACE⽅法是让Web服务器将之前的请求通信环回给客户端的⽅法。这个⽅法并不常⽤。

(8)CONNECT:要求⽤隧道协议连接代理

CONNECT⽅法要求在与代理服务器通信时建⽴隧道,实现⽤隧道协议进⾏TCP通信。主要使⽤SSL/TLS协议对通信内容加密后传输。HTTP的响应状态码

状态码是⽤来告知客户端服务器端处理请求的结果。凭借状态码⽤户可以知道服务器是请求处理成功、失败或者是被转发;这样出现了错误也好定位。状态码是由3位数字加原因短语组成。3位数字中的第⼀位是⽤来指定状态的类别。

共有五种如下:

1xx(Informational,信息性状态码):表⽰接收的请求正在处理

2xx(Success,成功状态码):表⽰请求正常处理完毕

3xx(Rediretion,重定向状态码):表⽰需要客户端进⾏附加操作

4xx(Client Error,客户端错误状态码):表⽰客户端的错误,服务器⽆法处理请求。

5xx(Server Error,服务器错误状态码):表⽰服务器处理请求出错。常⽤的⼏种HTTP状态码(最常⽤的8种加粗):

200:请求成功,服务器已成功处理了请求

300:多种选择。请求的资源可包括多个位置,相应可返回⼀个资源特征与地址的列表⽤于⽤户终端(例如:浏览器)选择

301(Moved Permanently,永久移动):请求的资源已被永久地移动到新URL,返回信息会包括新的URL,浏览器会⾃动定向到新URL,今后任何新的请求都应使⽤新的URL代替。

302(临时移动):资源只是临时被移动,客户端应继续使⽤原有URL

400(Bad request):客户端请求的语法错误,服务器⽆法理解

401(Unauthorized):请求需要有通过HTTP认证的认证信息

403(Forbidden):⽆权限,服务器拒绝提供服务

404(Not Found):没找到资源

408(Request Timeout):表⽰客户端请求超时

500(Internal Server error):服务器内部错误

503(Server Unavailable):服务暂不可⽤,表明服务器暂时处于超负载或正在进⾏停机维护,现在⽆法处理请求。

504(Gateway Timeout):⽹关超时,是代理服务器等待应⽤服务器响应时的超时。

505(HTTP version not supported):服务器不⽀持请求的HTTP协议的版本,⽆法完成处理。301和302的区别

301:永久性转移,表⽰旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的⽹址交换为重定向之后的⽹址。

302:暂时性转移,表⽰旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容⽽保存旧的⽹址。为什么要进⾏重定向?

(1)⽹站调整(如改变⽹页⽬录结构)

(2)⽹页被移到⼀个新地址

(3)⽹页扩展名改变(如应⽤需要把.php改为.html或.shtml)

这种情况下,如果不做重定向,则⽤户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到⼀个404页⾯操作信息,访问流量⽩⽩丧失;再者某些注册了多个域名的⽹站,也需要通过重定向让访问这些域名的⽤户⾃动跳转到主站点等。应⽤场景

301⽐较常⽤的场景:(1)域名跳转 (2)你把⽹页的后缀从.php改为.html

(3)把⽹站从http重定向到https

302⽐较常⽤的场景:(1)⽐如未登陆的⽤户访问⽤户中⼼重定向到登陆页⾯。

(2)访问404页⾯会⾃动重定向到⾸页。尽量使⽤301跳转,原因如下:(⽹络劫持)

从⽹址A做⼀个302重定向到⽹址B时,主机服务器的隐含意思是⽹址A随时有可能改主意,重新显⽰本⾝的内容或转向其他的地⽅。⼤部分的搜索引擎在⼤部分情况下,当收到302重定向时,⼀般只要去抓取⽬标⽹址就可以了,也就是说⽹址B。如果搜索引擎在遇到302转向时,百分之百的都抓取⽬标B的话,就不⽤担⼼URL劫持了。

问题就在于,有的搜索引擎,尤其是google,并不能总是抓取⽬标⽹址。⽐如说,有的时候A⽹址很短,但是它做了⼀个302重定向到B⽹址,⽽B⽹址是⼀个很长的乱七⼋糟的URL⽹址,甚⾄还有可能包含⼀些问号之类的参数。很⾃然的,A⽹址更加友好,⽽B⽹址既难看⼜不友好。这是google很有可能会仍然显⽰⽹址A。这就造成了⽹址URL劫持的可能性。

换句话解释⼀下:

从⽹站A(⽹站⽐较烂)上做了⼀个302跳转到⽹站B(搜索排名很靠前),这时候有时搜索引擎会使⽤⽹站B的内容,但却收录了⽹站A的地址,这样在不知不觉中,⽹站B在为⽹站A做贡献,⽹站A的排名就靠前。⽬前没有很好的解决⽹址劫持的⽅法,只能向google汇报。重定向的意义?

重定向是为了负载均衡或导⼊流量,提⾼SEO排名(搜索引擎排名)。利⽤⼀个前端服务器接受请求,然后负载到不同的主机上,可以⼤⼤提⾼站点的业务并发处理能⼒;重定向也可将多个域名的访问,集中到⼀个站点;由于,会被搜索引擎认为是两个⽹站,造成每个的连接数都会减少从⽽降低排名,永久重定向会将两个地址关联起来,搜索引擎会认为是同⼀个⽹站,从⽽提⾼排名。关于HTTP的常见问题及解答

(1)GET和POST的区别

1、GET:从指定的资源请求数据,POST:向指定的资源提交要处理的数据,所以GET⽤于获取信息⽽POST是⽤来更新资源信息

2、GET提交请求的数据实体会放在URL的后⾯,⽤?分割,参数⽤&连接,例如:/?name=li&age=20。POST查询字符串是在POST请求的HTTP消息主体中发送。

3、GET提交的数据长度有限制,因为URL长度有限制,具体的长度限制视浏览器⽽定,POST对数据长度没有要求。

4、GET提交的数据不安全,因为参数都会暴露在URL上,不应⽤来处理敏感数据。

5、GET请求可被缓存,可被收藏为书签,GET请求会保留在浏览器历史记录中。

POST请求不会被缓存,不能被收藏为书签,不会保留在浏览器历史记录中。(2)POST和PUT的区别?

POST⽅法不是幂等的,PUT⽅法则有幂等性

幂等:在计算机中,⼀个幂等操作的特点就是其任意多次执⾏所产⽣的影响均与依次⼀次执⾏的影响相同。

⽐如:POST在请求的时候,服务器会每次都创建⼀个⽂件,但是在PUT⽅法的时候只是简单地更新,⽽不是去重新创建,因此PUT是幂等的。(3)408 Request Timeout和504 Gateway Timeout的区别?

408是说请求超时,就是建⽴连接之后在约定的时间内客户端没有发送请求到服务端。本质上原因在于客户端或者⽹络拥塞。504是⽹关超时,是说代理服务器把客户端请求转发到应⽤服务器后在约定的时间内没有收到应⽤服务器的响应。本质上原因在于服务端的响应过慢,也有可能是⽹络问题。(4)Cookie和Session的区别和联系

Cookie和Session都是为了客户端和服务端之间的交互状态,实现机制不同,各有优缺点。⾸先⼀个最⼤的区别就是cookie是保存在客户端⽽session就保存在服务端的。cookie是客户端请求服务端时服务器会将⼀些信息以键值对的形式返回给客户端,保存在浏览器中,交互的时候可以加上这些cookie值。⽤cookie就可以⽅便的做⼀些缓存。

cookie的缺点:

(1)⼤⼩和数量都有限制。

(2)cookie是存在客户端的,可能被禁⽤、删除、篡改,是不安全的

(3)cookie如果很⼤,每次请求都要带上,这样就影响了传输效率session是基于cookie来实现的,不同的是session本⾝存在于服务端,但是每次传输的时候不会传输数据,只是把代表⼀个客户端的唯⼀ID写在客户端的cookie中,这样每次传输这个ID就可以了。

session的优势:传输数据量⼩,⽐较安全

session的缺点:如果session不做特殊的处理容易失效、过期、丢失或者session过多导致服务器内存溢出,并且要实现⼀个稳定可⽤安全的分布式session框架也是有⼀定复杂度的。cookie和session的区别:

1、Cookie保存在客户端,⽽Session保存在服务端

2、cookie不是很安全,别⼈可以分析存放在本地的COOKIE并进⾏COOKIE欺骗,考虑到安全应当使⽤session

3、session会在⼀定时间内保存在服务器上。当访问增多,会⽐较占⽤你服务器的性能,考虑到减轻服务器性能⽅⾯,应当使⽤COOKIE

4、单个cookie保存的数据不能超过4k(有的说是3K),很多浏览器都限制⼀个站点最多保存20个cookie

5、将登陆信息等重要信息存放为SESSION;其他信息如果需要保留,可以放在COOKIE中补充:

cookie的内容主要包括:名字、值、过期时间、路径和域。路径与域⼀起构成cookie的作⽤范围。若不设置过期时间,则表⽰这个cookie的⽣命期为浏览器会话期间,关闭浏览器窗⼝,cookie就消失。这种⽣命期为浏览器会话期的cookie就称为会话cookie。会话cookie⼀般不存储在硬盘上⽽是保存在内存⾥,当然这种⾏为并不是规范规定的。若设置了过期时间,浏览器就会把cookie保存在硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,⽐如两个IE窗⼝。⽽对于保存在内存⾥的cookie,不同的浏览器有不同的处理⽅式。session机制是⼀种服务器端的机制,服务器使⽤⼀种类似于散列表的结构来保存信息,当程序需要为某个客户端的请求创建⼀个session时,服务器⾸先检查这个客户端的请求⾥是否已包含了⼀个session标识(称为session id),如果已包含则说明已经为此客户端创建过session,服务器就按照session id把这个session检索出来使⽤(检索不到,会新建⼀个),如果客户端请求不包含session id,则为此客户端创建⼀个session并且⽣成⼀个与此sesion相关联的session id, session id的值应该是⼀个既不会重复,⼜不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。保存这个session id的⽅式可以采⽤cookie,这样在交互过程中浏览器可以⾃动的按照规则把这个标识发送给服务器。⼀般这个cookie的名字都是类似于session id。但是cookie可以被⼈为的禁⽌,则必须有其他机制以便在cookie被禁⽌时仍然能够把session id传递回服务器。2、 HTTP和HTTPS的区别?(1)HTTP的URL以http开头,HTTPS的URL以https开头

(2)HTTP是不安全的,⽽HTTPS是安全的。HTTP是超⽂本传输协议,信息是明⽂传输,HTTPS则是具有安全性的SSL加密传输协议。HTTPS协议是由SSL+HTTP协议构建的可进⾏加密传输、⾝份认证的⽹络协议,⽐HTTP协议安全。

(3)HTTPS协议需要到ca申请证书,HTTP⽆需证书。⼀般免费证书很少,需要交费

(4)HTTP和HTTPS使⽤的是完全不同的连接⽅式,⽤的端⼝也不⼀样,HTTP标准端⼝是80,HTTPS标准端⼝是443。

(5)HTTP的连接很简单,是⽆状态的。

(6)⽬前,HTTPS的应⽤⽐HTTP的少,是因为HTTPS⽐较耗性能,对于安全性没那么⾼要求的应⽤来说,⽤HTTP就已经够了。问题:浏览器如何验证HTTPS证书的合法性?

简单来说是验证两个问题;

(1)证书是否是信任的有效证书。所谓信任,就是指浏览器内置了信任的根证书,就是看看web服务器的证书是不是这些信任根发的或者信任根的⼆级证书机构颁发的。所谓有效,就是看看web服务器证书是否在有效期,是否被吊销了。

(2)对⽅是不是上述证书的合法持有者。简单来说证明对⽅是否持有证书的对应私钥。验证⽅法两种,⼀种是对⽅签个名,我⽤证书验证签名;另外⼀种是⽤证书做个信封,看对⽅是否能解开。

以上的所有验证,除了验证证书是否吊销需要和CA关联,其他都可以⾃⼰完成。验证正式是否吊销可以采⽤⿊名单⽅式或者OCSP⽅式。⿊名单就是定期从CA下载⼀个名单列表,⾥⾯有吊销的证书序列号,⾃⼰在本地⽐对⼀下就⾏。优点是效率⾼,确定是不实时。OCSP是实时连接CA去验证,优点是实时,缺点是效率不⾼。另外⼀种回答

要想验证证书是否有效,要检查三点

(1)验证证书是否在有效期内

证书中会包含证书的有效期的起始时间和结束时间,取⼀个时间点去⽐较就好了。

(2)验证证书是否被吊销了

被吊销的证书是⽆效的。验证吊销有CRL和OCSP两种⽅法

CRL即证书吊销列表。证书被吊销后会被记录在CRL中,CA会定期发布CRL。应⽤程序可以依靠CRL来检查证书是否被吊销了。CRL有两个缺点,⼀是有可能会很⼤,下载很⿇烦。针对这种情况有增量CRL这种⽅案。⼆是有滞后性,就算证书被吊销了,应⽤也只能等到发布最新的CRL后才能知道。增量CRL也能解决⼀部分问题,但没有彻底解决。

OCSP是在线证书状态检查协议。应⽤按照标准发送⼀个请求,对某张证书进⾏查询,之后服务器返回证书状态。OCSP可以认为是即时的(实际实现中可能会有⼀定延迟),所以没有CRL的缺点。不过对于⼀般的应⽤来说,实现OCSP还是有些难度的。

(3)验证证书是否是上级CA签发的

每⼀张证书都是由上级CA证书签发的,上级CA证书可能还有上级,最后会找到根证书。根证书即⾃签证书,⾃⼰签⾃⼰。

当你验证⼀张证书是否是由上级CA证书签发的时候,你必须有这张上级CA证书。通常这张证书会内置在浏览器或者是在操作系统中,有些场景下应⽤系统也会保留。

以上三点,只要有⼀个没通过,这张证书就是⽆效的,不该信任。3、 ISO七层⽹络模型/五层⽹络模型/TCPIP四层⽹络模型⼀、 ISO七层⽹络模型层数7654321名字应⽤层表⽰层会话层传输层⽹络层数据链路层物理层主要功能提供应⽤程序间通信处理数据格式、数据加密等建⽴、维护和管理会话建⽴主机端到端连接寻址和路由选择提供介质访问、链路管理等⽐特流传输对应的典型设备计算机:应⽤程序,如FTP、SMTP、HTTP等计算机:编码⽅式,如图像编解码、URL字段传输编码等计算机:建⽴会话,如session认证、断点续传计算机:进程和端⼝⽹络:路由器、防⽕墙、多层交换机⽹络:⽹卡、⽹桥、交换机⽹络:中继器、集线器、⽹线和HUB传输单位程序级数据程序级数据程序级数据数据段(segment)数据包(packet)帧(frame)⽐特(bit) ⼆、五层⽹络模型

(1)应⽤层:确定进程之间通信的性质以满⾜⽤户需求。应⽤层协议有很多,如⽀持万维⽹应⽤的HTTP协议,⽀持电⼦邮件的SMTP协议,⽀持⽂件传送的FTP协议等。

(2)运输层:负责主机间不同进程的通信。这⼀层中的协议有⾯向连接的TCP(传输控制协议)、⽆连接的UDP(⽤户数据报协议);数据传输的单元称为报⽂段或⽤户数据报。

(3)⽹络层:负责分组交换⽹中不同主机间的通信。作⽤:发送数据时,将运输层中的报⽂段或⽤户数据报封装成IP数据报,并选择合适路由。

(4)数据链路层:负责将⽹络层的IP数据报组装成帧。

(5)物理层:透明地传输⽐特流。三、TCP/IP分层模型(四层)

(1)应⽤层

对应于OSI七层模型的应⽤层和表⽰层。因特⽹的应⽤层协议包括:FTP(⽂件传输协议)、HTTP(超⽂本传输协议)、Telent(远程终端协议)、SMTP(简单邮件传送协议)等。

(2)传输层

对应于OSI七层模型的传输层,提供两种端到端的通信服务。其中TCP协议提供可靠的数据流运输服务,UDP协议提供不可靠的⽤户数据报服务。

(3)⽹间层

对应于OSI七层模型的⽹络层。本层包括IP协议、RIP协议,负责数据的包装、寻址和路由。同时还包含ICMP(⽹间控制报⽂协议)⽤来提供⽹络诊断信息。

(4)⽹络接⼝层

提供TCP/IP协议的数据结构和实际物理硬件之间的接⼝。4、 TCP和UDP的区别

类型可靠性连接性报⽂效率双⼯性流量控制拥塞控制TCP可靠⾯向连接⾯向字节流传输效率低全双⼯(点到点)有(滑动窗⼝)有(慢开始、拥塞避免、快重传、快恢复)UDP不可靠⽆连接⾯向报⽂(保留报⽂的边界)传输效率⾼⼀对⼀、⼀对多、多对⼀、多对多⽆⽆5、 同步和异步、阻塞和⾮阻塞、长线程和短线程的区别?

同步/异步主要针对client端(客户端),阻塞/⾮阻塞主要针对server端(服务器端)同步:发送⽅发出数据后,等待接收⽅发回响应以后才发下⼀个数据包的通讯⽅式。

异步:发送⽅发出数据后,不等待接收⽅发回响应,接着发送下个数据包的通讯⽅式。阻塞调⽤:是指调⽤结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。

⾮阻塞调⽤:指在不能⽴即得到结果之前,该函数不会阻塞当前线程,⽽会⽴即返回。HTTP的长连接和短连接本质上是TCP的长连接和短连接

短连接:⼀般只会在client/server间传递⼀次读写操作,就断开连接

长连接:在client/server完成⼀次读写之后,它们之间的连接并不会主动关闭,后续的读写操作会继续使⽤这个连接。在HTTP/1.0中,默认使⽤的是短连接。也就是说,浏览器和服务器每进⾏⼀次HTTP操作,就建⽴⼀次连接,但任务结束就终端连接。如果客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源,如JavaScript⽂件、图像⽂件、CSS⽂件等;当浏览器每遇到这样⼀个Web资源,就会建⽴⼀个HTTP会话。但从HTTP/1.1起,默认使⽤长连接,⽤以保持连接特性。使⽤长连接的HTTP协议,会在响应头加⼊代码:Connection:keep-alive6、 现在要访问,整个过程是怎样的?第⼀步:解析域名,找到主机IP

(1)先从浏览器缓存中找,如果有缓存,直接返回IP,否则下⼀步

(2)缓存中⽆法找到IP,浏览器会进⾏⼀个系统调⽤,查询hosts⽂件。如果找到,直接返回IP,否则下⼀步。(在计算机本地⽬录etc下有⼀个hosts⽂件,hosts⽂件中保存有域名与IP的对应解析,通常也可以修改hosts科学上⽹或破解软件)

(3)当(1)(2)查询均⽆果,只能借助于⽹络。路由器⼀般都会有⾃⼰的DNS缓存,ISP服务商DNS缓存,这是⼀般都能够得到相应的IP。如果还是⽆果,只能借助于DNS递归解析。

(4)这是,ISP的DNS服务器就会开始从根域名服务器开始递归搜索,从.com顶级域名服务器,到baidu的域名服务器。总结:浏览器缓存->系统hosts⽂件->路由器DNS缓存、ISP服务商DNS缓存->递归搜索(从.com根域名服务器到baidu的域名服务器)第⼆步:浏览器与⽹站建⽴TCP连接

浏览器利⽤IP直接与⽹站主机通信,通过三次握⼿,TCP连接建⽴完成第四步:显⽰页⾯或返回其他

返回状态码200ok,表⽰服务器可以处理请求,返回报⽂,由于在报头中,content-type为“text/html”,浏览器以html形式呈现,⽽不是下载⽂件。对于⼤型⽹站存在多个主机站点,往往不会直接返回请求页⾯,⽽是重定向。返回的状态码就不是200ok,⽽是301,302以3开头的重定向码,浏览器在获取了重定向响应后,在响应报⽂中location项找到重定向地址,浏览器重新第⼀步访问即可。6、 IP/TCP⾸部TCP⾸部的前20个字节是固定的,后⾯有可能还有4N字节的选项(根据需要⽽增加)。因此TCP⾸部最⼩长度是20个字节。

(1)每个TCP链接都包括源端与⽬的端的端⼝号,各占2个字节,这两个值加上IP⾸部中源端IP地址与⽬的端IP地址构成⼀个TCP连接

(2)序号,⽆符号数,占4个字节。是⽤来标识从发端向收端发送的数据字节流。TCP是⾯向字节流的,它所传送的字节流中的每个字节都按顺序编号,整个要传送的字节流的起始序号是在建⽴连接时设置。⽽⾸部中的序号字段值是本报⽂段所发送的数据的第⼀个字节的序号。

(3)确认号,也占4个字节,是期望收到的对⽅下⼀个报⽂段的第⼀个数据字节的序号。

只有ACK的标志为1时,确认序号字段才有效,发送该字段⽆任何代价,因为确认序号与ACK标志⼀样总是TCP⾸部的⼀部分。因此当⼀个连接被建⽴之后,这个字段总是被设置,ACK标志也总是被置为1。

(4)数据偏移,占4位(注意是位不是字节),它指出TCP报⽂段数据部分距报⽂段的起始部分有多远。也就是指出TCP报⽂段⾸部的长度。

(5)保留,占6位,保留为今后使⽤。下⾯要讲述⾮常重要的六个控制字段,这六个字段各占⼀位。(6)紧急URG(URGent):当URG=1时,表明“紧急指针”字段有效。它告诉系统此报⽂段中有紧急数据,应当尽快传送,⽽不要按原来的排除顺序进⾏传送。当你⽤⽹络程序传送数据时,忽然发现了⼀些问题,想取消该程序的运⾏,发出中断命令,这时就可以使⽤紧急数据,如果不这样,控制命令字符就处于TCP缓存末尾,只有在所有数据处理完毕之后,这个控制命令字符才会被交付到接收⽅的应⽤进程,这样就浪费了许多时间。(7)确认ACK(ACKnowlegment):当ACK=1时,“确认”字段才有效,TCP规定,在连接建⽴后,所有传送的报⽂段,都必须报⽂段置1。(8)推送PSH(PuSH):这个很少使⽤。(9)复位RST(ReSet):当RST=1表明,表明TCP连接中出现严重差错,必须释放连接,然后再重新建⽴连接。RST置1⽤来拒绝⼀个⾮法的报⽂段(例如客户端在没有发送SYN报⽂的情况下,忽然发送⼀个ACk包,服务端⾃然会回应⼀RST报⽂进⾏拒绝),或拒绝打开⼀个连接。因此RST位也叫做重置位或重建位。(10)同步SYN(SYNchronization):在建⽴连接时⽤来同步序号。当SYN=1⽽ACK=0时,表明这是⼀个连接请求报⽂段;对⽅若同意建⽴连接,则在响应的报⽂段使⽤SYN=1并且ACK=1。因此当SYN=1时,表明这是⼀个连接请求或连接接受报⽂。关于TCP的连接的建⽴与释放请看:Tcp协议怎样建⽴主机之间连接——“三次握⼿”(11)终⽌FIN(FiNis):⽤来释放⼀个连接,当FIN=1时,表⽰此报⽂段发送⽅的数据已发送完毕,并要求释放连。(12)窗⼝⼤⼩:占2个字节,窗⼝值范围是[0, 2的16次⽅-1]。窗⼝指的是发送报⽂段的⼀⽅的接收窗⼝(并⾮⾃⼰的发送窗⼝)。窗⼝值告诉对⽅:从本报⽂段⾸部中的确认号算起,接收⽬前允许对⽅发送的数据量。之所以要有这个限制,是因为接收⽅的数据缓存空间是有限的。窗⼝值将作为接收⽅让发送⽅设置其发送窗⼝的依据。窗⼝值是经常在变化着的。(13)检验和:占2个字节,该字段检验的范围包括报⽂段的⾸部和数据两个部分。(14)紧急指针:占2个字节,只有当URG=1时,这个字段才有效。它指出本报⽂段中紧急数据的字节数,⽽紧急数据结束后就是普通数据。当所有紧急数据都处理完成时,TCP就告诉应⽤程序恢复到正常操作。值得注意的是,即使窗⼝为0也可以发送紧急数据。(15)选项:长度可变,最长可以达40个字节。当没有使⽤选项时,⾸部的长度为20个字节。最初TCP只规定了⼀种选项即最⼤报⽂段长度MSS(Maximum Segment Size),它指的是报⽂段中数据部分的长度。后来⼜陆续增加了“窗⼝扩⼤”选项、“时间戳”选项及有关“选择确认(SACK)”选项。7、 TCP三次握⼿及四次挥⼿过程图如下: TCP状态转换图 上半部分是TCP三次握⼿过程的状态变迁

1、SYN_SENT:第⼀次握⼿发⽣阶段,客户端发起连接。客户端调⽤connect,发送SYN给服务器端,然后进⼊SYN_SENT状态,等待服务器端确认(三次握⼿中的第⼆个报⽂)。如果服务器端不能连接,则直接进⼊CLOSED状态。

2、LISTEN:服务器端等待连接的状态。服务器端经过socket, bind, listen函数之后进⼊此状态,开始监听客户端发过来的连接请求。此称为应⽤程序被动打开(等到客户端连接请求)。

3、SYN_RCVD:第⼆次握⼿发⽣阶段,这⾥是服务器端接收到了客户端的SYN,此时服务器由LISTEN进⼊SYN_RCVD状态,同时服务器端回应⼀个ACK,然后再发送⼀个SYN即SYN+ACK给客户端。4、ESTABLISHED:第三次握⼿发⽣阶段,客户端接收到服务器端的ACK包(ACK、SYN)之后,也会发送⼀个ACK确认包,客户端进⼊ESTABLISHED状态,表明客户端这边已经准备好,但TCP需要两端都准备好才可以进⾏数据传输。服务器端收到客户端的ACK之后会从SYN_RCVD状态转移到ESTABLISHED状态,表明服务器端也准备好进⾏数据传输了。这样客户端和服务器端都是ESTABLISHED状态,就可以进⾏后⾯的数据传输了。所以ESTABLISHED也可以说是⼀个数据传送状态。四次挥⼿过程的状态变迁

1、FIN_WAIT_1:第⼀次挥⼿,主动关闭的⼀⽅(执⾏主动关闭的⼀⽅既可以是客户端,也可以是服务器端,这⾥以客户端执⾏主动关闭为例),终⽌连接时,发送FIN给对⽅,然后等待对⽅返回ACK。调⽤close()第⼀次挥⼿就进⼊此状态。

2、CLOSE_WAIT:接收到FIN之后,被动关闭的⼀⽅进⼊此状态。具体动作是接收到FIN,同时发送ACK。之所以叫CLOSE_WAIT可以理解为被动关闭的⼀⽅此时正在等待上层应⽤程序发出关闭连接指令。因为TCP关闭是全双⼯过程,这⾥客户端执⾏了主动关闭,被动⽅服务器端接收到FIN后也需要调⽤close关闭,这个CLOSE_WAIT就是处于这个状态,等待发送FIN,发送了FIN则进⼊LAST_ACK状态。

3、FIN_WAIT_2:主动端(这⾥是客户端)先执⾏主动关闭发送FIN,然后接收到被动⽅返回的ACK后进⼊此状态。

4、LAST_ACK:被动⽅(服务器端)发起关闭请求,由状态2进⼊此状态,具体动作是发送FIN给对⽅,同时在接收到ACK时进⼊CLOSED状态。

5、CLOSING:两边同时发起关闭请求时(即主动⽅发送FIN,等待被动⽅返回ACK,同时被动⽅也发送了FIN,主动⽅接收到了FIN之后,发送ACK给被动⽅),主动⽅会由FIN_WAIT_1进⼊此状态,等待被动⽅返回ACK。

6、TIME_WAIT:四次挥⼿操作最后都会经过这样⼀个状态然后进⼊CLOSED状态。共有三个状态会进⼊此状态(1)由CLOSING进⼊:同时发起关闭情况下,当主动端接收到ACK后,进⼊此状态,实际上这⾥的同时是这样的情况:客户端发起关闭请求,发送FIN之后等待服务器端回应ACK,但此时服务器端同时也发起关闭请求,也发送了FIN,并且被客户端先于ACK接收到。

(2)由FIN_WAIT_1进⼊:发起关闭后,发送了FIN,等待ACK的时候,正好被动⽅也发起关闭请求,发送了FIN,这是客户端接收到了先前ACK,也收到了对⽅的FIN(即ACK和FIN同时收到),然后发送ACK,进⼊TIME_WAIT状态(这⾥跳过了FIN_WAIT_2状态)

(3)由FIN_WAIT_2进⼊问题:TIME_WAIT等待两个MSL作⽤?

可靠安全的关闭TCP连接。⽐如⽹络拥塞,主动⽅最后⼀个ACK被动⽅没收到,这时被动⽅会对FIN开启TCP重传,发送多个FIN包,在TCP/IP协议就是这样设计的,是不可避免的。主要有两个原因:

(1)⽹络情况不好时,如果主动⽅⽆TIME_WAIT等待,关闭前个连接后,主动⽅与被动⽅⼜建⽴起新的TCP连接,这时被动⽅重传或延时过来的FIN包过来后会直接影响新的TCP连接。

(2)同样⽹络情况不好并且⽆TIME_WAIT等待,关闭连接后⽆新连接,当接收到被动⽅重传或延迟的FIN包后,会给被动⽅回⼀个RST包,可能会影响被动⽅其他的服务连接。RST包:⽤于强制关闭TCP连接

RST标⽰复位、⽤来异常的关闭连接。

1. 发送RST包关闭连接时,不必等缓冲区的包都发出去,直接就丢弃缓冲区中的包,发送RST。

2. ⽽接收端收到RST包后,也不必发送ACK包来确认。什么时候发送RST包?

1. 建⽴连接的SYN到达某端⼝,但是该端⼝上没有正在 监听的服务。

2. TCP收到了⼀个根本不存在的连接上的分节。

3. 请求超时。 使⽤setsockopt的SO_RCVTIMEO选项设置recv的超时时间。接收数据超时时,会发送RST包。TIME_WAIT状态维持时间是两个MSL时间长度,也就是在1-4分钟,windows操作系统就是4分钟。

MSL就是maximum segment lifetime(最⼤分节⽣命期),这是⼀个IP数据包能在互联⽹上⽣存的最长时间,超过这个时间IP数据包将在⽹络中消失。问题:4、客户端收到⼀个窗⼝为 0 的包怎么处理?

有这样⼀个问题:考虑这样⼀种特殊情况,就是接收⽅若没有⾜够的缓存使⽤,就会发送零窗⼝⼤⼩的报⽂,此时发送⽅将发送窗⼝设置为0,停⽌发送数据,之后接收⽅有⾜够的缓存,发送了⾮零窗⼝⼤⼩的报⽂,但是这个报⽂在中途丢失了,那么发送⽅的发送窗⼝就⼀直为零导致死锁。解决这个问题:TCP为每个连接设置⼀个持续计时器,只要TCP的⼀⽅收到对⽅的零窗⼝通知。就启动该计时器,周期性的发送⼀个零窗⼝探测报⽂段(仅携带1字节的数据)。对⽅就在确认这个报⽂的时候给出现在的窗⼝⼤⼩。(注:TCP规定,即使设置为零窗⼝,也必须接收以下⼏种报⽂段,零窗⼝探测报⽂段,确认报⽂段和携带紧急数据的报⽂段)。8、 DNS是什么?本机使⽤DNS时是TCP连接还是UDP?DNS(Domain Name System的缩写)域名系统,主要提供⽹站域名与IP地址的相互转化的服务,就是根据域名查出IP地址。你可以把它想象成⼀本巨⼤的电话本。

具体来说,如果你要访问域名,⾸先要通过DNS查出它的IP地址是。域名解析时使⽤UDP协议

客户端向DNS服务器查询域名,⼀般返回的内容都不超过512字节,⽤UDP传输即可。不⽤经过TCP三次握⼿,这样DNS服务器负载更低,响应更快。虽然从理论上说,客户端也可以指定向DNS服务器查询的时候使⽤TCP,但事实上,很多DNS服务器进⾏配置的时候,仅⽀持UDP查询包。DNS服务的⼯作过程:

当DNS客户机需要查询程序中使⽤的名称时,它会查询本地DNS服务器来解析该名称。客户机发送的每条查询消息都包括3条信息,以指定服务器应回答的问题。

(1)指定的DNS域名,表⽰为完全合格的域名(FQDN)

(2)指定的查询类型,它可根据类型指定资源记录,或作为查询操作的专门类型。

(3)DNS域名的指定类别

对于DNS服务器,它始终应指定为internet类别。10、 TCP如何保证可靠性TCP协议如何保证可靠传输:

(1)确认和重传:接收⽅收到报⽂就会确认,发送⽅发送⼀段时间后没有收到确认就重传

三种协议:停-等协议,后退N帧协议,选择重传协议

(2)数据校验—TCP头部字段:校验和

验证的⽅法:将校验和与要校验的字段相加,结果为0就是正确的

(3)数据合理分⽚和排序

UDP:IP数据报⼤于1500字节,⼤于MTU。这个时候发送⽅IP层就需要分⽚。把数据报分成若⼲⽚,使每⼀⽚都⼩于MTU。⽽接收⽅IP层则需要进⾏数据报的重组。这样就会多做许多事情,⽽更严重的是,由于UDP的特性,当某⼀⽚数据传送中丢失时,接收⽅便⽆法重组数据报。将导致丢弃整个UDP数据报。

TCP会按MTU合理分⽚,接收⽅会缓存未按序到达的数据,重新排序后再交给应⽤层。

(4)流量控制:当接收⽅来不及处理发送⽅的数据,能提⽰发送⽅降低发送的速率,防⽌包丢失。

所以如果窗⼝值为0,发送端就会开启⼀个持续计数器,每个⼀段时间询问⼀下接收⽅。

(5)拥塞控制:当⽹络拥塞时,减少数据的发送。

慢开始、拥塞避免、快重传、快恢复11、 IO多路复⽤多路IO复⽤,有时也称为事件驱动IO,基本原理就是有个函数(如select)会不断地轮询所负责的所有socket,当某个socket有数据到达了,就通知⽤户进程。select、poll和epoll都是多路IO复⽤的机制。多路IO复⽤就通过⼀种机制,可以监视多个描述符,⼀旦某个描述符(⼀般是读就绪或者写就绪),能够通知程序进⾏相应的读写操作。但select、poll和epoll本质上都是同步IO,因为它们都需要在读写时间就绪后⾃⼰负责进⾏读写,即是阻塞的,⽽异步IO则⽆须⾃⼰负责进⾏读写,异步IO的实现会负责把数据从内核拷贝到⽤户空间。select和poll⽐较:

⼀般认为poll()⽐select()要⾼级⼀些,主要源于以下⼏个原因:

(1)poll()不要求开发者在计算最⼤⽂件描述符时进⾏+1的操作

(2)poll()在应付⼤数⽬的⽂件描述符的时候速度更快,因为对于select()来说内核需要检查⼤量描述符对应的fd_set中的每⼀个⽐特位,⽐较费时。

(3)select()可以监控的⽂件描述符数⽬是固定的,相对来说也较少(1024或2048)。如果需要监控数值⽐较⼤的⽂件描述符,或是分布得很稀疏的较少的描述符,效率也会很低。⽽对于poll()函数来说,就可以创建特定⼤⼩的数组来保存监控的描述符,⽽不受⽂件描述符值⼤⼩的影响,⽽且poll()可以监控的⽂件数⽬远⼤于select()

(4)对于select()来说,所监控的fd_set在select()返回之后会发⽣变化,所以在下⼀次进⼊select()之前都需要重新初始化需要监控的fd_set,poll()函数将监控的输⼊和输出事件分开,允许被监控的⽂件数组被复⽤⽽不需要重新初始化。

(5)select()函数的超时参数在返回时也是未定义的,考虑到可移植性,每次在超时之后在下⼀次进⼊到select()之前都需要重新设置超时参数。fd_set可以理解为⼀个集合,这个集合中存放的是⽂件描述符(file descriptor),即⽂件句柄,这可以认为是常说的普通意义的⽂件。select()的优点:

(1)select()的可移植性更好,在某些UNIX系统上不⽀持poll()

(2)select()对于超时值提供了更好的精度,⽽poll()是精度较差epoll的优点:

(1)⽀持⼀个进程打开⼤数⽬的socket描述符(FD)

(2)IO效率不随FD数⽬增加⽽线性下降

传统的select/poll另⼀个致命弱点就是当你拥有⼀个很⼤的socket集合,不过由于⽹络延迟,任⼀时间只有部分的socket是“活跃”的,但是select/poll每次调⽤都会线性扫描全部的结合,导致效率呈现线性下降。但是epoll不会存在这个问题,它只会对“活跃”的socket进⾏操作,这是因为在内核中实现epoll是根据每个fd上⾯的callback函数实现的。那么只有“活跃”的socket才会主动去调⽤callback函数,其他idle状态socket则不会,在这点上,epoll实现了⼀个“伪”AIO,因为这时候推动⼒由Linux内核提供。

(3)使⽤mmap加速内核与⽤户空间的消息传递。问题:epoll ⽔平触发和边缘触发是什么?

Level_triggered(⽔平触发):当被监控的⽂件描述符上有可读写事件发⽣时,epoll_wait()会通知处理程序去读写。如果这次没有把数据⼀次性全部读写完(如读写缓冲区太⼩),那么下次调⽤ epoll_wait()时,它还会通知你在上没读写完的⽂件描述符上继续读写,当然如果你⼀直不去读写,它会⼀直通知你如果系统中有⼤量你不需要读写的就绪⽂件描述符,⽽它们每次都会返回,这样会⼤⼤降低处理程序检索⾃⼰关⼼的就绪⽂件描述符的效率Edge_triggered(边缘触发):当被监控的⽂件描述符上有可读写事件发⽣时,epoll_wait()会通知处理程序去读写。如果这次没有把数据全部读写完(如读写缓冲区太⼩),那么下次调⽤epoll_wait()时,它不会通知你,也就是它只会通知你⼀次,直到该⽂件描述符上出现第⼆次可读写事件才会通知你这种模式⽐⽔平触发效率⾼,系统不会充斥⼤量你不关⼼的就绪⽂件描述符

发布者:admin,转转请注明出处:http://www.yc00.com/news/1687919200a57158.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信