【写在前面】 本篇完全为个人的笔记,对于计算机网络希望大家学习
计算机组网 http图解 tcp图解 和 tcpip编程。在编程中把学习的知识内化,本篇笔记比较适合面试~
一 OSI 七层协议模型
应用层:主要是应用比如http协议 pop3 ftp协议等
表示层:数据格式标识,基本压缩加密功能
会话层:建立session会话连接
传输层:以数据段传输,有tcp协议和udp协议
网络层:以数据包进行传输,负责寻址 路由方面的工作,有arp协议等
数据链路层:定义数据的基本格式,如何传输,如何标识;如网卡MAC地址
物理层:比特流 物理连接,比如网线 电缆等
七层协议模型是理想状态。现实中使用四层协议模型
应用层:集合了表示 会话 和应用
传输层:
网络层
物理层:数据链路和原先的物理层
二 TCP协议三次握手
1 三次握手的过程
1 客户端处于关闭状态,服务端处于监听状态listen
2 客户端发起syn数据包,发送seq=x,ack=1 的数据包给服务器,此时客户端变为等待确认状态
3 服务端接收到客户端发出的syn请求连接,向客户端发送ack确认信号:seq=y ACK=x
4 客户端接收到服务端发送的确认信号,再发一个syn告诉服务端我已经收到了你的信号,seq=x+1, ACK= y在编程中,我们的客户端发起connect就是调用tcp三次握手的过程
2 为什么要三次握手
第一次握手是客户端向服务端发起连接,告诉服务端我要连接发数据了
第二次握手是服务端告诉客户端,我能收到你的信号并且能发送信号给你,这个时候服务端只知道客户端能发送,但是不知道客户端是否能接收
第三次握手是客户端告诉服务端我能接收信号,第三次发送的数据可以携带其他的数据内容。
三次握手可以避免服务端无端等待的过程,减少资源的占用
3 关于syn攻击
在tcp建立连接的时候,假如第三次握手服务端没有收到客户端发送的消息,就会等待重新发送。在等待重新发送的这个过程,假如有很多不同ip地址的客户端向服务器发起链接,就会导致服务端将链接放到队列中,不断重新发起确认重连,导致资源的极大浪费。
要如何改进呢?
三 TCP协议四次挥手
1 tcp的四次挥手过程
挥手过程是客户端或者服务端都是能发起的,下面举例按照客户端发起
1 客户端发起FIN报文,ack=1,fin=x告诉服务器我的数据发送完了我要准备关闭连接了
2 服务端接收到fin报文,回写确认信号ACK=x,FIN =y,告诉客户端我接收到你的关闭申请
3 服务器还能发送数据,等待服务端数据发送完毕之后,会向客户端发送FIN报文,告诉客户端,我数据发送完毕了,我也准备关闭了
4 客户端接收到服务端发送的FIN报文,知道服务端数据发送完毕了,可以准备关闭,就回写一个确认信号,并等待2ML 关机。
2为什么是四次挥手?为什么要等待2ML
四次挥手的原因:每次挥手智能发送一个FIN报文,对方收到报文需要先回一个确认,只有当服务端发送完毕了,才会向客户端发送FIN报文告诉客户端准备关闭,客户端在回写确认报文
TIME_WAIT状态也成为2MSL等待状态。每个具体TCP实现必须选择一个报文段最大生存时间MSL(Maximum Segment Lifetime),它是任何报文段被丢弃前在网络内的最长时间。这个时间是有限的,因为TCP报文段以IP数据报在网络内传输,而IP数据报则有限制其生存时间的TTL字段。
对一个具体实现所给定的MSL值,处理的原则是:当TCP执行一个主动关闭,并发回最后一个ACK,该连接必须在TIME_WAIT状态停留的时间为2倍的MSL。这样可让TCP再次发送最后的ACK以防这个ACK丢失(另一端超时并重发最后的FIN)。
这种2MSL等待的另一个结果是这个TCP连接在2MSL等待期间,定义这个连接的插口(客户的IP地址和端口号,服务器的IP地址和端口号)不能再被使用。这个连接只能在2MSL结束后才能再被使用
等待2ml的原因:
1 保证客户端发送的最后一个ACK报文段能够到达服务端。
这个ACK报文段有可能丢失,使得处于LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认,服务端超时重传FIN+ACK报文段,而客户端能在2MSL时间内收到这个重传的FIN+ACK报文段,接着客户端重传一次确认,重新启动2MSL计时器,最后客户端和服务端都进入到CLOSED状态,若客户端在TIME-WAIT状态不等待一段时间,而是发送完ACK报文段后立即释放连接,则无法收到服务端重传的FIN+ACK报文段,所以不会再发送一次确认报文段,则服务端无法正常进入到CLOSED状态。
2防止“已失效的连接请求报文段”出现在本连接中。
客户端在发送完最后一个ACK报文段后,再经过2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失,使下一个新的连接中不会出现这种旧的连接请求报文段。
五 HTTP协议发起请求经过了什么
1 http请求首先我们在网页上输入网址,首先针对网址做寻址工作,寻址工作是如下,先查找浏览器缓存是否有对应的ip地址,没有再去寻找本地缓存(一般是运营商提供),没有再去找本地服务器缓存(递归查询),没有再去寻找根服务器缓存(迭代查询)。使用DNS协议(dns协议是udp连接的速度比较快),解析出域名对应的ip地址。
2 知道ip地址之后,通过tcp的三次挥手建立和ip的连接
3 建立连接之后,获取服务端的数据,通过json解析等将数据返回给客户端
六 关于DNS路径解析:
DNS是udp连接的。(DNS叫做域名解析)
1 先查询浏览器缓存
2 查询本地缓存
3 询问本地域名服务器
4 询问根域名服务器
5 寻找到对应的ip地址根据DNS协议告诉本地域名服务器,告诉本地缓存,本地缓存告诉浏览器的同时,将ip地址缓存起来,方便下次查找
七 密钥
1 对称密钥
2 非对称密钥
八 SYN攻击
同一时间使用大量的虚拟ip地址向服务器发送连接,导致服务的瘫痪。
九 http协议和https协议
1 http协议,端口号80 传输时不加密,直接打包传输,容易造成泄漏,但是速度也比较快。
在http1 中只有单管道技术,所以不能在同一个tcp连接发起多个线程同时传输数据。
如果面对数据量比较大的传输,建立多个连接,等待
在http2中有多管道技术,能够在同一个连接中并发的下载传输数据
2 https协议,端口号443,是http协议和ssl的联合,能够加密,不会造成数据泄漏,由于加密的关系前期的数据开销比较大。具有多管道技术