计算机网络知识总结

  • OSI(开放系统互连参考模型)
    • 物理层:其作用是使原始的数据比特流能在物理媒介上传输。
    • 数据链路层:主要作用是通过效验、确认、反馈等手段,将不可靠的物理链路改造成对网络层来说无差错的数据链路。数据链路层还要协调收发双方的数据传输效率,即进行流量控制。
    • 网络层:数据以网络协议数据单元为单位进行传输。网络层关心的是通信子网的运行控制,主要解决如何使数据分组跨越通信子网从源传送到目的地的问题,这就需要在通信子网中进行路由选择。(ip协议:网络之间互连的协议)
    • 传输层:是一个端到端(主机-主机)的层次。传输层提供的端到端的透明数据传输服务,使上层用户不必关心通信子网的存在。(TCP/UDP协议)
    • 会话层:是进程-进程的层次,其主要功能是组织和同步不同的主机各种进程间的通信
    • 表示层:为上层用户提供共同的数据或信息的语法表示交换
    • 应用层:开放系统互连环境的最高层(HTTP协议)
  • TCP三次握手
    • 1

      计算机网络知识总结

      • Listen:表示服务器的某个SOCKET处于监听状态,可以接受连接
      • SYN_SENT:当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,因此SYN_SENT状态,并等待服务端发送三次握手的第2个报文,SYN_SENT状态表示客户端已发送SYN报文
      • SYN_RCVD:这个状态表示服务端已经接受到了SYN报文,在正常情况下这个状态很短暂,并向客户端发送一个SYN+ACK包,此时服务器进入SYN_RECV状态
      • ESTABLISHED:客户端收到服务器的SYN+ACK包之后发送一个ACK包给服务器,随后客户端和服务器进入ESTABLISHED状态,表示已经建立连接。
  • TCP四次挥手
    • 2

      计算机网络知识总结

      •  由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。
      • 第一次挥手:Client发送一个FIN,用来关闭Client和Server的数据传送,客户端随即进入FIN_WAIT_1状态
      • 第二次挥手:服务端收到FIN后,发送一个ACK给Client,确认序号+1,服务端进入CLOSED_WAIT状态,客户端进入FIN_WAIT_2(实际上FIN WAIT1和FIN WAIT2状态的真正含义是等待对方的FIN报文)
      • 第三次挥手:服务器发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态
      • 第四次挥手:客户端收到FIN后,客户端进入TIME_Wait状态,接着发送一个ACK给Server,确认序号为收到序号+1,服务端进入CLOSED状态,完成四次挥手。
  • 为什么收到Server端的确认之后,Client还需要进行第三次“握手”呢
    • 采用三次握手是为了防止失效的连接请求报文段突然又传送到主机,如果只采用两次握手,已经失效的报文段发送给服务端之后,服务端确认之后就建立了连接,而客户端却并没有发出建立连接的请求,所以不会理会服务器端的确认,而服务器端一直等待客户端传送数据,造成了资源浪费
  • 为什么要四次挥手
    • 主要是确保数据能够完成传输,当一方发送FIN报文时,它仅仅表示对方没有数据发送给你了,但未必你的全部数据已经传输完毕,所以ACK报文和FIN报文大多数情况下都是分开发送的。
  • 建立连接的第二个syn作用是啥
    • 因为客户端发送的syn可能过来好久才到达服务端,而此时客户端超时重传的syn已经到达服务端,那么后来的syn就是无效的,如果不发第二个syn查询客户端是否有效的话,服务端就会监听这个延迟到达的请求,造成资源的浪费。
  • time_wait状态产生的原因
    • 主要是无法保证你左后发送的ACK报文会一定被对方收到,对方可能因为网络原因未收到ACK报文而在此发送FIN报文,所以必须维持这条连接状态,当客户端等待2MSL后,没有收到服务端的FIN报文,就说明服务端收到了ACK报文
    • 允许老的重复分节在网络中消逝(A在发送完最后一个ACK报文段后,再经过2MSL,就可以使本链接持续时间内所的所有报文段都从网络中消逝,这样使下一个新的连接不会出现这种旧的连接请求报文段
  • 如果网络连接中出现大量TIME_WAIT状态会带来哪些危害
    • 创建新的socket连接的时候可能会收到影响,因为本地端口的数量有限
    • 如何消除TCP短连接引发的TIME_Wait
      • 可以改为长连接,但代价太大(会导致服务器性能问题)
      • 增大可用端口的范围
  • 当关闭连接时最后一个ACK丢失怎么办?、
    • 如果最后一个ACK丢失的话,TCP就会认为它的FIN丢失,进行重发FIN,客户端收到FIN后,就会设置一个2MSL计时器,2MSL计时器可以使客户端等待足够长的时间,使得在ACK丢失的情况下,可以等待下一个FIN的到来,如果重传FIN到达客户端,客户端进入CLOSED状态,那么客户端就永远收不到这个重传的FIN报文段,服务器收不到ACK,服务器无法关闭.
  • TCP如何保证可靠传输
    • 在传递数据之前,会有三次握手来建立连接
    • 应用数据被分割成TCP认为最合适的数据块
    • 超时重发
    • 对失序数据进行重新排序,然后才交给应用层
  • TCP建立连接之后怎么保持连接
    • 一种是由TCP协议层实现的Keepalive机制,另一种是由应层自己实现的HeartBeat心跳包
  • TCP存在的缺陷有哪些
    • TCP三次握手可能会出现SYN Flood攻击
    • Connection Flood攻击
      • 利用真实的IP地址向服务器发起大量的连接,并且建立连接之后很长时间不释放,并定时发送垃圾数据给服务器使得连接得以长时间保持
  • 三次握手与accept()函数的关系
    • 连接建立,调用accept()函数获取连接
  • 三次握手和四次挥手协议中,客户端和服务端各用到什么函数
    • socket()函数
    • bind()函数
    • listen()函数
    • accept()函数
    • read()/write()函数
    • close函数
  • listen的真正目的
    • listen的函数为侦听端口创建两个对列:未完成队列(SYN_RCV状态)和已完成队列
  • TCP与UDP的区别,以及各自的用途和使用领域
    • 基于连接和无连接
      • TCP是面向连接的协议,而UDP是无连接的协议。TCP连接的时候会进行三次握手
    • 可靠性
      • TCP提供交付保证,意味着一个使用TCP协议发送的消息是保证交付给客户端的,
      • 如果消息在传输过程中丢失,那么它将重发
    • 有序性
      • 消息到达网络的另一端时可能是无序的,TCP协议会为你排好序。UDP不提供任何有序性的保证
    • 速速
      • TCP速度比较慢,而UDP速度比较快;TCP适合传输大量数据,UDP适合传输少量数据
    • 重量级VS轻量级
      • TCP是重量级的协议,UDP是轻量级的协议
    • 流量控制或拥塞控制
      • TCP有流量控制或拥塞控制,UDP没有。
      • TCP如何实现流量控制和拥塞控制
        • 流量控制就是让发送方的发送效率不要太快,要让接收方来的及接受
    • TCP面向字节流,UDP面向报文
    • TCP应用场景:效率要求相对低,但是准确性要求相对高如文件传输,邮件传输,远程登录
    • UDP应用场景:效率要求高,准确性要求相对低;如qq,微信聊天。
    • UDP的可靠性如何提高
      • 通过第七层(应用层)来实现。
  • TCP头部字段有哪些
    • ACK确认序号有效
    • SYN:发送链接请求
    • FIN:释放连接请求
    • 窗口大小字段:控制流量
    • RST:重新l连接
    • 紧急位URG:告诉系统此报文段中有紧急数据,应该尽快传递。
  • HTTP请求报文结构和响应报文结构
    • HTTP请求报文:请求行、请求头、空行、请求正文
      • 请求行:请求方法、URL/以及协议版本
      • 请求头:请求头部为请求报文添加了一些附加信息,由名/值对组成
      • 空行:表示请求头部结束,接下来为请求正文
      • 请求正文:可选部分。GET请求就没有正文
    • HTTP响应报文
      • 主要由状态行、响应头、空行、响应正文四个部分组成
        • 状态行:3个部分组成:协议版本,状态码,状态码描述
        • 响应头:与请求头类似,为响应报文添加一些附加信息
        • 空行
        • 响应正文
    • 常见HTTP首部字段
      • Date ;Connection ;Host ;Accept
  • http中有关缓存的首部字段有哪些?http的浏览器缓存机制
    • Last-Modified和if-Modified-Since
      • 都是用于记录页面最后修改时间的HTTP头信息,只是Last-Modified是由服务器往客户端发送的HTTP头,而if-Modified-Since则是由客户端往服务器发送头,再次请求本地缓存也页面时,客户端会通过会将if-Modified-Since头把浏览器端缓存页面的最后一次被服务器修改的时间一起发到服务器,服务器会把这个时间和服务器上实际文件的最后修改时间进行比较。通过这个时间判断客户端的页面是否是最新的,如果是最新的就返回HTTP状态码200和新的文件内容,客户端接到之后,会丢弃旧文件,把新文件缓存起来。如果是最新的(返回304)就直接把文件缓存在浏览器中。
      • 优点:减少了网络上传输的数据量,同时减轻了服务器的负担。
  • 什么是Etag
    • 服务器会为每个资源分配对应的Etag值,根据资源的内容的得到其值。当资源内容发生改变时吗,其值也会改变。
  • 既然有了Last-Modified,为什么还要用E-tag
    • 某些文件修改十分频繁,比如秒一下的修改,if-modified-Since的检查粒度不能检查到
    • 一些文件周期性的修改,但是他的内容并不改变,这个时候我们并不希望客户端认为这个文件被修改
  • Expires/Cache-Control(优先使用)
    • 用来控制缓存的失效日期,控制浏览器是直接从浏览器缓存数据还是重新发送请求到服务器取数据。
    • Expires是web服务器响应消息头字段,在响应http请求时告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据,而无需再次请求。
  • 运用Last-Modified和ETag缓存页面的过程
    • 客户端请求页面(A)
    • 服务器返回页面A,并在给A加上一个Last-Modifief和Etag
    • 客户端展现该页面,并将页面连同Last-Modified和ETAG的值一起缓存起来
    • 客户再次请求页面A,并将上次请求时服务器返回的Last-Modified和ETag的值一起传给服务器
    • 服务器检查Last-Modified或ETag,并判断出该页面自上次客户端请求之后还未修改就直接返回响应304和一个空体
  • Http1.1和Http1.0的区别、
    • HTTP/1.1默认使用持久连接(数据传输完成了保持TCP连接不断开),等待同域名下继续用这个通道传输数据;
    • HTTP/1.1引入被称为分块的传输方法,该方法使发送方能将消息实体分割为任意大小的组块,并单独发送他们
    • HTTP/1.1加入了一个新的状态码100,用于客户端在发送POST数据给服务器前,征询服务器情况,看服务器是否处理POST数据
    • HTTP/1.1在Request消息头里多一个Host域。HTTP1.0则没有这个域,在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,这个IP地址只有一个主机,随着虚拟机主机技术发展,一台物理服务器上可以存在多个虚拟主机.
  • 常用的HTTP 方法有哪些
    • GET:用于请求访问已经被URL识别的资源,可以通过URL传参给服务器‘
    • POST:用于传输信息给服务器,主要功能与GET方法类似,但一般推荐使用POST方式
    • PUT:传输文件,报文文体中包含文件内容,保存到对应的URL位置
    • HEAD:获得报文首部,与GET方法类型四,只是不返回报文主体
    • DELETE:删除文件,与PUT方法相反,删除对应的URL位置文件
    • OPTIONS:下旬相应URL支持的HTTP方法
  • Http的请求方式get和post的区别
    • Get一般用于获取或者查询资源信息,是安全的(没有修改资源的状态)
    • Post一般用于更新资源信息,不是安全的.
    • Get请求的数据会被浏览器缓存起来(信息存在URL上)
    • Post请求的数据不会被浏览器缓存(传递的信息在请求的报文的消息体中)
  • 为什么Http是无状态的?如何保持状态(会话跟踪技术、状态管理)
    • HTTP无状态:无状态是指协议对于事物没有记忆能力,不能保存每次客户端提交的信息,即当服务器返回应答之后,这次事务的所有信息就都丢掉了。
      • 优点:服务器不用为每一个客户端连接分配内存记忆状态,也不用在客户端失去连接时去清理内存
      • 缺点:却少状态意味着如果后续处理需要前面的信息,客户端必须重传,这样可能导致连接传送的数据量增大
    • 可以采用会话跟踪技术来解决问题,把状态保存在服务器中,只发送回一个标识符,浏览器在下次提交中把这个标识符发送过来,这样,就可以定位存储在服务器上的状态信息。
      • 有四种会话跟踪技术
      • COOKIE
      • Session
      • URL重写
      • 作为隐藏域嵌入HTML表单中
      • Web Storage技术
    • Session和Cookie的区别
      • Seesion是存放在服务端,类似于Session结构来存放用户数据,当浏览器第一次发送请求时,服务器自动生成一个Session和和SessionID用来唯一标识这个Session,并通过响应发送到浏览器。当浏览器第二次发送请求时,会将前一次服务器响应中的Session ID放在请求一并发送到服务器上,服务器从请求中提取出SessionID,并和保存的所有SessionID进行对比,找到用户对应的Session;一般情况下,服务器会在一定时间内保存这个Session,过了时间限制就会销毁这个Session
      • Cookie数据保存在客户端,如登录网站的用户名和密码以Cookie的形式保存。(Cookie是实现session的一种方式)
      • 应用场景
        • Cookie应用于网站登录时的信息
        • 购物车
      • 如果客户端禁用了Cookie怎么办
        • 一般情况下,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个sid=xxxx这样的参数,服务器据此来识别用户
  • HTTP的短连接和长连接的原理
    • 短连接:浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接;HTTP1.0需要在request中增加"Connection:keep-alive"header才能支持长连接
      • 优点:不用为每个客户端连接分配内存记忆状态
      • 缺点:客户端请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽
    • 长连接:HTTP/1.1的默认连接方式,在请求头和响应头加入Connection:keep-alive;Keep-Alive不会永久保持连接,它会保持一段时间。
      • 长连接优点:通过开启和关闭更少的TCP连接,节约CPU时间和内存
      • 长连接缺点:服务器维护一个长连接会增加开销
  • HTTP的特点
    • 支持客户端/服务器端通信模式
    • 简单方便快速:客户端向服务端发送请求时,只是简单的填写请求路径和请求方法
    • 无连接:无连接的含义每次建立的连接只处理一个客户端请求。当服务器处理完客户端的请求之后,服务器端立即断开连接
    • 无状态:协议对于处理请求没有记忆功能
  • HTTP和HTTPS
    • HTTP不安全,HTTPS就是HTTP加上加密处理(一般是SSL安全通信线路)+认证+完整性保护
    • HTTPS的作用
      • 内容加密:建立一个信息安全通道,来保证数据安全
      • 身份验证:确认网站的真实性
      • 数据完整性:防止内容被第三方冒充篡改
    • HTTP使用80端口,HTTPS使用443端口
  • 说下HTTP协议
    • HTTP协议即超文本传输协议。是用于规定浏览器和服务器之间互相通信的规则,应用于OSI七层模型的最高层应用层,HTTP的主要特点是简单快捷,灵活,无状态,无连接(1.1使用持续连接),HTTP工作流程(首先客户机与服务器需要建立连接,建立连接后发送一个请求给服务器,请求方式的格式为:统一资源表示符、协议版本号,服务器接到请求之后给予相应的响应信息,客户端接受服务器所返回的信息通过浏览器显示在用户显示器),HTTP请求报文结构,响应报文结构
    • http和Socket的区别
      • 创建Socket连接时,可以指定使用传输层协议 ,Socket可以支持不同的传输层协议,(TCP/UDP)。当使用Tcp协议时,Socket连接就是一个TCP连接,Socket连接一旦建立,通信双方可以相互发送数据
      • HTTP连接使用的是“请求-响应”的方式,不仅请求时需要建立连接,而且需要客户端向服务器发出请求后,服务器才能返回数据
      • Socket效率较高
  • Socket编程
    • 创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP/UDP),Server端所要做的事情主要是建立一个通信的断点,然后等待客户端的请求。 典型处理步骤如下:(服务端建立连接的过程)
      • 构建一个ServerSocket实例,指定本地端口。这个socket就是用来监听指定端口的连接请求
      • 重复如下几个步逐
        • 调用socket的accept()方法来获得下面客户端的连接请求。通过accept()方法返回的socket实例,建立了一个和客户端的新连接
        • 通过这个返回的socket实例获取InputStream和OutputStream方法,可以通过这两个stream来分别读和写数据
        • 结束时调用socket实例的close()方法关闭socket连接
    • 客户端的请求过程稍微有点不一样
      • 构建Socket实例,通过指定的远程服务器地址和端口来建立连接
      • 通过Socket实例包含的InputStream湖人OutputStream来进行数据的读写
      • 操作结束后调用socket实例的close方法关闭