zoukankan      html  css  js  c++  java
  • 计算机网络面试核心

    OSI开放式互联参考模型

    第一层  物理层

    机器之间的比特流传输,定义网线的类型,光纤的接口类型,各种传输介质的传输数据

    第二层 数据链路层

    如何格式化数据,交换机工作在此层·

    物理寻址,同时将原始比特流转变为逻辑传输线路

    第三层 网络层

    控制子网的运行,如逻辑编址、分组传输、路由选择      路由器工作在此层

    第四层 传输层

    接受上一层的数据,在必要的时候把数据进行分割,并将这些数据交给网络层,且保证这些数据段有效到达对端  TCP协议,UDP协议

    第五层 会话层

    不同机器上的用户之间建立及管理会话

    第六层 表示层

    信息的语法语义以及它们的关联,如加密解密、转换翻译、压缩解压缩

    第七层 应用层

     

    传输控制协议TCP简介

    (1)面向连接的、可靠的、基于字节流的传输层通信协议

    (2)将应用层的数据流分割成报文段并发送给目标节点的TCP层

    (3)数据包都有序号,对方收到则发送ACK确认,未收到则重传

    (4)使用校验和来检验数据在传输过程中是否有误

    TCP报文头

     序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。

     确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。

     同步SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。

    TCP Flags:

    URG:紧急指针标志

    ACK:确认序号标志

    PSH:push标志

    RST:重置连接标志

    SYN:同步序号,用于建立连接过程

    FIN:finish标志,用于释放连接

     TCP的三次握手

    (1)首先客户端向服务端发送一段TCP报文,其中

      标记位为SYN,表示”请求建立连接“,

      序号为seq=x(x一般为1),

      随后客户端进入同步已发送(SYN_SENT)阶段

    (2)服务端接收到来自客户端的一段TCP报文之后,结束LISTEN阶段,并返回一段TCP报文。其中

      标志位为SYN和ACK,表示”确认客户端的报文seq序号有效,服务端能正常接受客户端发送的数据,并同意创建新连接“

      序列号为seq=y

      确认号为ack=x+1,表示收到客户端的序列号seq并将其值加1作为自己确认号ack的值,随后服务器进入同步已接受(SYN_RCVD)阶段

    (3)客户端接收到来自服务端的确认收到数据的TCP报文之后,明确了从客户端到服务器的数据传输是正常的,结束SYN_SENT阶段,并返回最后一段TCP报文。其中

      标志位为ACK,表示确认收到服务端同意连接的信号

      序号为seq=x+1,表示收到服务器端的确认号ack,并将其值作为自己的序号值

      确认号为ack=y+1,表示收到服务器端的seq,并将其值+1作为自己的确认号ack的值

      随后客户端进入ESTABLISHED阶段

    为什么要进行第三次握手

    “第三次握手”是客户端向服务器端发送数据,这个数据就是要告诉服务器,客户端有没有收到服务器“第二次握手”时传过去的数据。若发送的这个数据是“收到了”的信息,接收后服务器就正常建立TCP连接,否则建立TCP连接失败,服务器关闭连接端口。由此减少服务器开销和接收到失效请求发生的错误。

    建立连接后,客户端出现故障怎么办

    TCP设有保活机制。

    连接中启动保活功能的一端,在保活时间内连接处于非活动状态,则向对方发送一个保活探测报文,如果收到响应,则重置保活计时器,如果没有收到响应报文,则经过一个保活时间间隔后再次向对方发送一个保活探测报文,如果还没有收到响应报文,则继续,直到发送次数到达保活探测数,此时,对方主机将被确认为不可到达,连接被中断。

    TCP四次挥手

    (1)首先客户端想要释放连接,向服务器端发送一段TCP报文,其中:

      标记位为FIN,表示“请求释放连接“;

      序号为Seq=U;

      随后客户端进入FIN-WAIT-1阶段,即半关闭阶段。并且停止在客户端到服务器端方向上发送数据,但是客户端仍然能接收从服务器端传输过来的数据。

      注意:这里不发送的是正常连接时传输的数据(非确认报文),而不是一切数据,所以客户端仍然能发送ACK确认报文。

    (2)服务器端接收到从客户端发出的TCP报文之后,确认了客户端想要释放连接,随后服务器端结束ESTABLISHED阶段,进入CLOSE-WAIT阶段(半关闭状态)并返回一段TCP报文,其中:

      标记位为ACK,表示“接收到客户端发送的释放连接的请求”;

      序号为Seq=V;

      确认号为Ack=U+1,表示是在收到客户端报文的基础上,将其序号Seq值加1作为本段报文确认号Ack的值;

      随后服务器端开始准备释放服务器端到客户端方向上的连接。客户端收到从服务器端发出的TCP报文之后,确认了服务器收到了客户端发出的释放连接请求,随后客户端结束FIN-WAIT-1阶段,进入FIN-WAIT-2阶段

    (3)服务器端自从发出ACK确认报文之后,经过CLOSED-WAIT阶段,做好了释放服务器端到客户端方向上的连接准备,再次向客户端发出一段TCP报文,其中:

      标记位为FIN,ACK,表示“已经准备好释放连接了”。注意:这里的ACK并不是确认收到服务器端报文的确认报文。

      序号为Seq=W;

      确认号为Ack=U+1;

      表示是在收到客户端报文的基础上,将其序号Seq值加1作为本段报文确认号Ack的值。

    随后服务器端结束CLOSE-WAIT阶段,进入LAST-ACK阶段。并且停止在服务器端到客户端的方向上发送数据,但是服务器端仍然能够接收从客户端传输过来的数据。

    (4)客户端收到从服务器端发出的TCP报文,确认了服务器端已做好释放连接的准备,结束FIN-WAIT-2阶段,进入TIME-WAIT阶段,并向服务器端发送一段报文,其中:

      标记位为ACK,表示“接收到服务器准备好释放连接的信号”。

      序号为Seq=U+1;表示是在收到了服务器端报文的基础上,将其确认号Ack值作为本段报文序号的值。

      确认号为Ack=W+1;表示是在收到了服务器端报文的基础上,将其序号Seq值作为本段报文确认号的值。

      随后客户端开始在TIME-WAIT阶段等待2MSL

    为什么“握手”是三次,“挥手”却要四次?

    TCP建立连接时之所以只需要"三次握手",是因为在第二次"握手"过程中,服务器端发送给客户端的TCP报文是以SYN与ACK作为标志位的。SYN是请求连接标志,表示服务器端同意建立连接;ACK是确认报文,表示告诉客户端,服务器端收到了它的请求报文。

    即SYN建立连接报文与ACK确认接收报文是在同一次"握手"当中传输的,所以"三次握手"不多也不少,正好让双方明确彼此信息互通。

    TCP释放连接时之所以需要“四次挥手”,是因为FIN释放连接报文与ACK确认接收报文是分别由第二次和第三次"握手"传输的。

    为什么客户端在TIME-WAIT阶段要等2MSL?

    为的是确认服务器端是否收到客户端发出的ACK确认报文

    当客户端发出最后的ACK确认报文时,并不能确定服务器端能够收到该段报文。所以客户端在发送完ACK确认报文之后,会设置一个时长为2MSL的计时器。MSL指的是Maximum Segment Lifetime:一段TCP报文在传输过程中的最大生命周期。2MSL即是服务器端发出为FIN报文和客户端发出的ACK确认报文所能保持有效的最大时长。

    服务器端在1MSL内没有收到客户端发出的ACK确认报文,就会再次向客户端发出FIN报文;

    ------------恢复内容结束------------

  • 相关阅读:
    远程线程注入与CreateRemoteThread
    游戏修改器编写原理
    软件保护技术常见保护技巧
    反跟踪技术
    C++用static声明的函数和变量小结
    PE文件格式分析及修改
    MMX指令集在C++中的使用
    HOOKAPI之修改IAT法则
    如何获取 程序加载后的内存起始地址
    Java线程中断的本质和编程原则
  • 原文地址:https://www.cnblogs.com/-2016/p/12625765.html
Copyright © 2011-2022 走看看