计算机网络是计算机专业很重要的一门课,课程中详细阐述了两台计算机之间是如何进行通讯、如何保证通讯的可靠性、如何保证通讯的高效性等等内容,在平常coding中可能比较少关注到这方面,可是在真正遇到网络方面的问题没法解决时,了解计算机网络的原理倒是十分必要的。linux
工程学科是不断迭代的过程,所以七层协议大概是这么进化来的。面试
物理层解决了两台机器之间相互通讯的问题,首先机器A发送了一些比特流,机器B须要收到这些比特流,这就是物理层所作的事情。物理层主要定义了网络设备的标准,例如接口的类型、机器的类型、网络的类型等。其传输的数据主要是bit流,也就是010101....这类数据,以电流强弱定义,也就是D/A or A/D转换。物理层的分组称为bit。算法
在传输bit流的过程当中,会产生错传、数据传输不完整的状况,数据链路层就应运而生。数据链路层主要定义数据格式化传输、以及如何控制对物理介质的访问,一般还有错误控制和纠正,处理错误数据。这一层将分组称为帧。数据库
在数据传输的过程当中,须要有数据发送方和数据接收方,并且在网络愈来愈复杂的变化中,如何在多个节点中找到最佳路径精准地找到接收方,这就是网络层须要作的事。网络层会将网络地址翻译为对应的物理地址,而后经过计算,得出从节点A到节点B的最佳路径,本层的协议是IP协议,在本层中将分组称为数据报。浏览器
在网络层传输的过程当中,会中断好屡次,因此须要把发送的信息切割为一个一个的Segment,分段传输,那么其中一段发送失败了或出现错误了,要怎么办,是否须要重传,这就是传输层须要干的事。传输层保证了传输的质量,这层也被称为OSI七层模型中最重要的一层,本层须要关注的协议为TCP/UDP协议。另外传输层会将数据报进行进一步切割,例如:以太坊没法接收大于1500Byte的数据报,因而传输层就将报文分割为多个报文段,并按顺序发送,而且传输层是负责端到端的传输。缓存
会话层的做用就是创建和管理应用程序之间的通讯,无需用户过多地参与到TCP/IP协议中。安全
表示层能够帮助咱们翻译在不一样类型网络上的数据,例如加密解密、转换翻译、压缩解压缩等。服务器
应用层规定发送方和接收方必须使用固定长度的消息头,而且封装了各类的报文信息,旨在使用户更方便地应用网络中接收到的数据,该层须要关注的协议为HTTP协议,该层的分组称为报文。cookie
网络数据处理流程为,发送方先自上而下封装,接收方自下而上解封数据。而事实上OSI并无真正实现网络,而TCP/IP五层模型其实是对OSI参考模型的实现。网络
源端口:发送方的端口号
目的端口:接收方的端口号
序号:TCP报文段的序号
确认序号:接收方接收到了序号为x的报文段,期待收到序号为x+1为起始的报文段。
数据偏移:报文段在整个报文中偏移的字节量
保留域:备用区
标志位:URG(紧急信息)、ACK(确认标志位)、PSH(为1则收到信息收当即交给进程,无需再队列中等待)、RST(重置标链接)、SYN(请求链接)、FIN(结束链接)
检验和:检验数据是否正确
>为何须要有2MSL的等待时间?
>1.确保对方收到本身的ACK,若是对方未收到ACK则会重发FIN请求,一来一回正好为2ML。
>2.避免新旧链接混淆。
>为何须要四次挥手?
>由于确保服务器端和客户端都有FIN和ACK。
复制代码
其原理是:例用三次握手的规则,在客户机向服务器发送请求后,在服务器发送SYN-ACK后下线,服务器则没法收到ACK确认,服务器段则会不断重试,重试间隔为1s,2s,4s,8s,16s,32s,在linux默认情况下会等待63s,若是有大量的链接重复此过程,则会形成服务器链接队列耗尽,这就是洪泛攻击的原理。
防御措施:linux下设置了TCP_SYN_Cookies参数,若为正常链接,客户机发回SYN Cookie,若是为异常链接,就不发回,但也不会影响到链接队列。
创建链接后客户机忽然出现故障:服务器默认“保活机制”,会在必定时间内发送请求,若几回请求无应答,则将该客户机标识为不可达客户机。
首先先看UDP报文头:
结论:
1.TCP面向链接,UDP面向无链接
2.TCP可靠,UDP不可靠
3.TCP有序,UDP可能无序
4.TCP速度慢,UDP速度快
5.TCP重量级,UDP轻量级
复制代码
发送方滑动窗口的四类数据:
接收方滑动窗口三类数据
2.未接收但能够接收的数据
3.未接收且没法接收的数据
当接收方滑动窗口不足时,发送方是不会移动本身的滑动窗口的,只有当发送方的滑动窗口以前的全部数据都被确认,发送方的滑动窗口才会向后移动,这也是TCP保证数据完整性的重要手段。
>请求方式 url 协议版本
>头部字段名:值
>......
>头部字段名:值
>请求正文
复制代码
例如:
>POST /user HTTP/1.1 //请求行
>Host: www.baidu.com
>Content-Type: application/x-www-form-urlencoded
>Connection: Keep-Alive
>User-agent: Mozilla/5.0. //以上是首部行
>(此处必须有一空行) //空行分割header和请求内容
>name=world 请求体
复制代码
请求/响应的步骤 1.客户端链接到Web服务器
2.发送HTTP请求
3.服务器接受请求并返回HTTP响应
4.释放TCP链接(若是是keep-alive则保持一段时间)
5.客户端解析HTML内容
1.在浏览器地址栏键入URL,按下回车后经历的流程。
答:首先要进行DNS解析,将访问的域名解析为IP地址,解析是由近到远的,首先在浏览器缓存中寻找是否有对应的IP,若是没有则进入系统缓存,若是没有则按照路由器缓存->IPS服务器缓存->根域名缓存->顶级域名服务器缓存,这样一路查找,直到找到了则中止查找,直接返回。而后进行TCP链接,默认端口80,进行三次握手(能够简单描述三次握手的流程),创建链接后发送HTTP请求,服务器处理请求并返回HTTP报文,浏览器解析并渲染页面,最后链接结束。
2.常见的HTTP状态码。 答:先分类。
1xx提示信息--表示请求已接受,继续处理
2xx表示成功链接
3xx重定向--要完成请求必须进行更进一步操做
4xx表示浏览器(客户端)出现错误
5xx表示服务器端出现错误
常见的HTTP状态码:
200 ok,成功链接
400 bad request(客户端请求语法错误,服务器没法理解)
401:未经受权
403:拒绝服务
404:Not Found
500内部服务器错误
503:当前不能处理,一段时间后可能能够恢复正常。
3.GET和POST请求的区别。
答:1.HTTP报文层面:GET请求信息放在URL后(?XXX=XXX&XX=XXX),POST放在报文体,安全一些(但其实没什么区别,抓包能够直接抓到报文)
2.数据库层面:GET符合幂等性(对数据库一次或屡次操做,结果是一致的)和安全性(对数据库一次或屡次操做,没有改变数据库中的数据),GET是作查询操做的,不会改变数据库中的数据。
3.POST插入,每次请求都有可能不同。
其余层面,GET能够被CDN缓存,被存储,在服务量巨大的环境下,又有大部分的数据是只读的,因此咱们并不想让服务器彻底处理,就可使用GET请求,但POST不行,POST必须交由服务器处理。
4.Cookie和Session的区别
Cookie是客户端解决方案,由服务器发给客户端的特殊信息,以文本的形式存放在客户端。
Cookie使用过程:
1.用户向服务器发送我的识别信息,服务器也向客户端发送Cookie文件。
2.客户端再次发送请求时,也会把cookie发送回去。
3.服务端会获取cookie从而生成与客户端相对应的内容。
Session 服务端解决方案,Session是在服务器上保存的信息。服务器解析客户端请求并操做SessionId,按需保存状态信息。若是客户端包含SessionId则直接使用,若是不包含则建立一个。
Session实现方式:
1.使用Cookie实现
客户端向服务端发送请求,服务端返回响应报文并SetCookie,Cookie中含有JSESSIONID-XXXXX,客户端以后的每次请求都会携带这个Cookie,服务端根据这个Cookie中的Session提供响应的内容。
2.使用URL回写实现
使用URL回写即在URL地址中携带JSESSIONID这个参数。
Tomcat同时支持Cookie和URL回写,默认使用Cookie,当浏览器拒绝Cookie时,则使用URL回写的方式实现Session
区别:
Cookie是以文件的形式存储在客户端,而Session是在服务器端进行处理的,Session相对Cookie来讲比较安全,由于Cookie存储在客户端,容易被修改,而Session存在于服务器端,没法被修改,但Session会占用服务器资源,影响服务器性能,若是考虑服务器性能优先,则能够考虑多使用Cookie。
HTTPS:超文本传输安全协议
HTTP:HTTP+TCP+IP
HTTPS:HTTP+(SSL OR TLS)+TCP+IP
要说HTTP和HTTPS的区别首先要提到SSL和加密方式。
SSL是为网络通讯提升安全及数据完整性的一种安全协议,是操做系统对外的API,SSL3.0后改名为TLS,采用身份验证和数据加密保证网络通讯安全和数据的完整性。
HTTPS使用证书+各类加密方式共同加密
加密的三次握手过程:
1.浏览器将支持的加密算法信息发送给服务器
2.服务器选择一套浏览器支持的加密方式,以证书的形式回发给浏览器。包含CA机构,公钥,有效期,全部者等。
3.浏览器验证证书的合法性,并结合证书公钥,加密信息发送给服务器。
4.服务器使用私钥解密,验证hash,加密响应消息回发浏览器
5.浏览器对响应消息进行解密,并对消息进行验证,以后进行密文交互数据。
HTTPS须要到CA申请证书,而HTTP不须要。
HTTPS的证书是须要收费的,HTTP不收费。
HTTPS默认端口为443,HTTP默认端口为80。
HTTPS为有状态协议,HTTP为无状态协议。
虽然说HTTPS是安全协议,可是HTTPS也未必安全,在浏览器默认填充http:// 的状况下访问https的网站,请求须要进行跳转,这个过程当中就有被劫持的风险。但可使用HSTS优化(自行了解)。
经过上文的叙述,能够大概了解OSI七层网络模型的“各司其职”、了解TCP/IP协议族、还有三次握手四次挥手的整个过程、了解洪泛攻击的原理、TCP/UDP的区别以及TCP中拥塞控制之滑动窗口,还了解了HTTP协议以及HTTP安全协议——HTTPS,还稍微谈到了点Socket。 计算机网络是一门大的学科,上面所说的也不过百分之二三,寥寥而已。可是基本能够知足平常开发所需。
本文图片来自网络,侵删。
欢迎你们访问个人我的博客:Object's Blog