计算机网络
OSI七层模型
应用层 (Application):
网络服务与最终用户的一个接口。
协议有:HTTP FTP TFTP SMTP SNMP DNS
表示层(Presentation Layer):
数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)
格式有,JPEG、ASCll、DECOIC、加密格式等
会话层(Session Layer):
建立、管理、终止会话。(在五层模型里面已经合并到了应用层)
对应主机进程,指本地主机与远程主机正在进行的会话
传输层 (Transport):
定义传输数据的协议端口号,以及流控和差错效验。
协议有:TCP UDP,数据包一旦离开网卡即进入网络传输层
网络层 (Network):
进行逻辑地址寻址,实现不同网络之间的路径选择。
协议有:ICMP IGMP IP(IPV4 IPV6) ARP RARP
数据链路层 (Link):
建立逻辑连接、进行硬件地址寻址、差错效验等功能。(由底层网络定义协议)
将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。
物理层(Physical Layer):
建立、维护、断开物理连接。(由底层网络定义协议)
TCP/IP(五层)
表示层:解决不同主机的通信的数据格式问题
会话层:建立和管理应用程序之间的通信(连接)(对下层的封装) 方便用户使用,自动收发包 报文
传输层:拆包组包 TCP:保证数据包的完整性 和 以及处理传输过程中可能发生的危险 UDP:发完就完了 报文----拆分成---->包
网络层:路由和地址解析。选择适当的网络节点进行路由。 包 ---->数据帧
数据链路层:控制对物理设备的访问 规定数据如何在不同物理设备上进行传出 并提供数据纠错功能。在不可靠的物理设备上提供可靠传输 数据数据帧
物理层:定义通信的物理设备的规格。网线接口类型,光纤接口类型,传输速率等
因为Socket通信时候用到了IP和端口,仅这两个就表明了它用到了网络层和传输层;而且它无视多台电脑通信的系统差别,所以它涉及了表示层;一般Socket都是基于一个应用程序的,所以会涉及到会话层和应用层。
http和https
http的端口是80,https的端口是443,两个都是应用层协议,
https是架设在SSL/TLS上,并会使用到CA证书,http响应速度比https快,因为http使用了TCP三次握手建立连接,而https出了TCP的三个包还要加上SSL握手的九个包,一共十二个包。
工作流程是这样的:
- 当请求https网站时
- 会在服务器端产生公钥和私钥
- 然后将公钥返回给客户端
- 客户端验证是否合法,如果合法会产生一个随机key,不合法会响应https警告
- 将随机产生的key隐藏传输给服务器
- 服务器会使用私钥进行解密从而获取key值,并使用客户端提供的key去隐藏加密内容
- 然后将加密内容发送给客户端
- 客户端使用随机生产的key进行解密
TCP为什么是三次握手四次挥手
TCP协议在建立连接时需要进行三次握手,在释放连接时需要进行四次挥手,这是因为TCP协议的设计目标是保证可靠性,防止数据丢失或错误。
在三次握手的过程中,第一次握手是客户端向服务器发送SYN报文,服务器返回SYN+ACK报文,这样服务器就知道了客户端的接收能力和请求连接的意愿;第二次握手是服务器向客户端发送ACK报文,并确认客户端的请求,这样客户端就确认了服务器的接收能力和请求连接的意愿;第三次握手是客户端再次向服务器发送ACK报文,完成了三次握手,建立了连接。这样的设计能够确保双方都能够正确收发数据,从而保证数据传输的可靠性。
在四次挥手的过程中,第一次挥手是客户端发送FIN报文,表示要关闭连接,但客户端可能还有未发送完的数据,所以还需要等待服务器的ACK确认;第二次挥手是服务器发送ACK报文确认客户端的关闭请求,并告知客户端将进入CLOSE_WAIT状态;第三次挥手是服务器发送FIN报文,表示服务器也准备关闭连接,但可能还有未发送完的数据,所以还需要等待客户端的ACK确认;第四次挥手是客户端发送ACK报文确认服务器的关闭请求,表示双方都已关闭连接。这样的设计能够确保数据能够完整的传输,同时避免因为网络拥塞等原因导致数据包丢失。
综上所述,TCP协议采用三次握手和四次挥手的方式进行建立和释放连接,是为了确保数据传输的可靠性和安全性,从而保证数据的正确性。
TCP和UDP的主要特点
UDP的主要特点 UDP是无连接的,发送数据之前不需要建立连接,因此减少了开销和发送数据之前的时延。 UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表。 UDP是面向报文的。UDP对应用层交下来的报文,既不合并也不拆分,而是保留这些报文的边界。UDP 一次交付一个完整的报文。 UDP没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。这对某些实时应用是很重要的。很适合多媒体通信的要求。 UDP支持一对一、一对多、多对一和多对多的交互通信。 UDP的首部开销小,只有8个字节,比TCP的20个字节的首部要短。
TCP是面向连接的运输层协议。
每一条TCP连接只能有两个端点(endpoint),每-条TCP连接只能是点对点的(一对一)。
TCP提供可靠交付的服务。
TCP提供全双工通信。
面向字节流
1.TCP中的"流”(stream)指的是流入或流出进程的字节序列。
2.“面向字节流” 的含义是:虽然应用程序和TCP的交互是一次一个数据块,但TCP把应用程序交下来的数据看成仅仅是一连串无结构的字节流。
为什么需要time_wait?
- 可靠的终止TCP连接
- 保证让迟来的TCP报文有足够的时间被识别并抛弃
具体来说:
- 网络情况不好的时候,如果主动方无TIME_WAIT等待,关闭前个连接后,主动方与被动方又建起新的TCP连接,这时被动方重传或者延时过来的fin包会直接影响新的TCP连接
- 同样网络情况不好并且无TIME_WAIT等待,关闭连接后无新连接,当接收到被动方重传或者延时的fin包,给被动方回一个RST包,可能会影响被动方其他的服务连接
Time_wait过多的危害
一个time_wait占用4k大小,过多的占用不少内存
在高并发短连接的TCP服务器上,当服务器处理完主动请求关闭连接,会有大量连接处于time_wait(超时等待)状态,服务器维护每一个连接需要一个socket,也就是每一个连接会占用一个文件描述符,而文件描述符的使用是有上限的,如果持续高并发,会导致一些正常的连接失败
解决方案是修改配置,使得服务器处于time_wait状态下能够被快速回收和重用。(我也没有具体操作过)配置文件:/etc/sysctl.conf;
有一个net.ipv4.tcp_tw_recycle = 1表示开启TCP连接中TIME-WAIT socket的快速回收
DNS
域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。
DNS解析过程
客户端发送一个DNS请求,请问qq你的IP的什么啊,同时会在本地域名服务器(一般是网络服务是临近机房)打声招呼
本地收到请求以后,服务器会有个域名与IP的映射表。如果存在,则会告诉你,如果想访问qq,那么你就访问XX地址。不存在则会去问上级(根域服务器):"老铁,你能告诉我www.qq.com"的IP么
根DNS收到本地DNS请求后,发现是.com,"www.qq.com哟,这个由.com大哥管理,我马上给你它的顶级域名地址,你去问问它就好了"
这个时候,本地DNS跑去问顶级域名服务器,"老哥,能告诉下www.qq.com"的ip地址码",这些顶级域名负责二级域名比如qq.com
顶级域名回复:"小本本记好,我给你www.qq.com区域的权威DNS服务器地址",它会告诉你
本地DNS问权威DNS服务器:"兄弟,能不能告诉我www.qq.com对应IP是啥"
权威DNS服务器查询后将响应的IP地址告诉了本地DNS,本地服务器将IP地址返回给客户端,从而建立连接。
状态码:
2xx (3种)
200 OK:表示从客户端发送给服务器的请求被正常处理并返回;
204 No Content:表示客户端发送给客户端的请求得到了成功处理,但在返回的响应报文中不含实体的主体部分(没有资源可以返回);
206 Patial Content:表示客户端进行了范围请求,并且服务器成功执行了这部分的GET请求,响应报文中包含由Content-Range指定范围的实体内容。
3xx (5种)
301 Moved Permanently:永久性重定向,表示请求的资源被分配了新的URL,之后应使用更改的URL;
302 Found:临时性重定向,表示请求的资源被分配了新的URL,希望本次访问使用新的URL;
301与302的区别:前者是永久移动,后者是临时移动(之后可能还会更改URL)
303 See Other:表示请求的资源被分配了新的URL,应使用GET方法定向获取请求的资源;
302与303的区别:后者明确表示客户端应当采用GET方式获取资源
304 Not Modified:表示客户端发送附带条件(是指采用GET方法的请求报文中包含if-Match、If-Modified-Since、If-None-Match、If-Range、If-Unmodified-Since中任一首部)的请求时,服务器端允许访问资源,但是请求为满足条件的情况下返回改状态码;
307 Temporary Redirect:临时重定向,与303有着相同的含义,307会遵照浏览器标准不会从POST变成GET;(不同浏览器可能会出现不同的情况);
4xx (4种)
400 Bad Request:表示请求报文中存在语法错误;
401 Unauthorized:未经许可,需要通过HTTP认证;
403 Forbidden:服务器拒绝该次访问(访问权限出现问题)
404 Not Found:表示服务器上无法找到请求的资源,除此之外,也可以在服务器拒绝请求但不想给拒绝原因时使用;
5xx (2种)
500 Inter Server Error:表示服务器在执行请求时发生了错误,也有可能是web应用存在的bug或某些临时的错误时;
503 Server Unavailable:表示服务器暂时处于超负载或正在进行停机维护,无法处理请求;
输入一条URL的变化过程
在浏览器中输入URL后,通常会经历以下几个步骤:
-
DNS解析:浏览器首先会解析URL中的域名部分,将域名转换为服务器IP地址。这个过程需要向DNS服务器发送请求进行域名解析,并缓存已解析的结果以提高速度。
-
建立TCP连接:浏览器会使用HTTP协议向服务器发出请求,建立TCP连接。在建立TCP连接时,需要进行三次握手来确保连接的可靠性。
-
发送HTTP请求:一旦TCP连接建立,浏览器就会向服务器发送HTTP请求,请求包括请求方法、路径、HTTP版本、请求头等信息。
-
服务器处理请求并返回HTTP响应:服务器收到请求后,会根据请求的内容进行处理,然后返回HTTP响应。响应包括状态行、响应头、响应内容等信息。
-
浏览器处理响应:浏览器收到响应后,会对响应进行处理,包括解析HTML代码、渲染页面、执行JavaScript脚本等等。其中,HTML代码被解析成DOM树,CSS代码被解析成CSSOM树,然后合并成Render树进行页面布局和绘制。
-
断开TCP连接:页面加载完毕后,浏览器会断开与服务器的TCP连接,释放资源。
以上是一个典型的HTTP请求过程,其中还包括一些细节和特殊情况的处理,比如HTTP缓存、HTTPS安全加密等等,不同场景下可能会有些差异。但总体来说,这个过程描述了浏览器访问网站的主流程。