美文网首页
Java面试——TCP/IP

Java面试——TCP/IP

作者: 抬头挺胸才算活着 | 来源:发表于2020-04-09 00:08 被阅读0次

    参考资料:
    [1]. 网络编程之accept函数和accept函数在三次握手中的位置
    [2]. TCP 粘包/拆包的原因及解决方法

    https的过程

    https可以简单理解为http over SSL,SSL是一个加密协议,先非对称加密再对称加密。
    非明文传输
    数字签名
    证书

    http的状态码

    200 - 请求成功
    301 - 资源(网页等)被永久转移到其它URL
    404 - 请求的资源(网页等)不存在
    500 - 内部服务器错误

    SSL四次握手的过程

    客户端发送hello信息和其他附加信息
    服务器发送hello信息和带有公钥的证书
    客户端检验证书
    客户端用公钥对随机生成的数字C进行加密并发送
    服务器响应。

    accept函数是在三次握手的哪个阶段?

    第三个阶段之后,accept按理来说可以在第二次握手之后,因为服务器已经准备好了,只等客户端发送第三次握手。但是accept的时候会分配资源,如果客户端不继续了,就浪费了很多资源。

    TCP的四次挥手,time wait状态有什么意义

    这个时间是在接收到对方的fin开始的,是为了防止对方没有收到ack,如果对方没有收到ack,对方会重发fin,然后自己再重发ack。
    为什么要等待两个MSL,因为要等待ACK超时+重发MSL的时间。如果是服务器主动断开,那么服务器在TIME_WAIT的时候会锁定端口,该客户端无法新建连接。

    拥塞控制和流量控制的区别

    1. 都是通过窗口来控制发送的数据量
    2. 拥塞控制是避免网络出现拥堵,流量控制是避免接收方缓存溢出
    3. 目的不同
      拥塞控制是让网络能够承受现有的网络负载,它是一个全局性的过程,设计所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素。
      流量控制往往是指点对点的通信量的控制,即接收端控制发送端,它所要做的就是一直发送端的发送数据的速率,以便使接收端来得及接收。

    TCP粘包,拆包解决

    粘包:
    1、要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包。
    2、接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。
    拆包
    1、要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包。
    2、待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。
    解决办法:
    1、发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度,这样接收端在接收到数据后,通过读取包首部的长度字段,便知道每一个数据包的实际长度了。
    2、发送端将每个数据包封装为固定长度(不够的可以通过补0填充),这样接收端每次从接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。
    3、可以在数据包之间设置边界,如添加特殊符号,这样,接收端通过这个边界就可以将不同的数据包拆分开。

    TCP与UDP的区别

    1、基于连接与无连接;
    2、对系统资源的要求(TCP较多,UDP少);
    3、UDP程序结构较简单;
    4、流模式与数据报模式 ;
    5、TCP保证数据正确性,UDP可能丢包;
    6、TCP保证数据顺序,UDP不保证。

    谈一下,为什么tcp为什么要建立连接?

    为了传输的可靠性。因为TCP是面向流的,多次发送的,如果不建立连接,就没有记录端口的一些状态,丢失重发,可靠性传输的一些机制也无法实现。

    请说明一下http和https的区别

    1)https协议要申请证书到ca,需要一定经济成本;2) http是明文传输,https是加密的安全传输;3) 连接的端口不一样,http是80,https是443;4)http连接很简单,没有状态;https是ssl加密的传输,身份认证的网络协议,相对http传输比较安全。

    请讲一下浏览器从接收到一个URL,到最后展示出页面,经历了哪些过程

    1.DNS解析 2.TCP连接 3.发送HTTP请求 4.服务器处理请求并返回HTTP报文 5.浏览器解析渲染页面

    请简单解释一下,arp协议和arp攻击。

    ARP(Address Resolution Protocol)即地址解析协议, 用于实现从 IP 地址到 MAC 地址的映射,即询问目标IP对应的MAC地址。ARP协议通过"一问一答"实现交互,但是"问"和"答"都有讲究,"问"是通过广播形式实现,"答"是通过单播形式。
    ARP欺骗攻击建立在局域网主机间相互信任的基础上的
    当A发广播询问:我想知道IP是192.168.0.3的硬件地址是多少?
    此时B当然会回话:我是IP192.168.0.3我的硬件地址是mac-b,
    可是此时IP地址是192.168.0.4的C也非法回了:我是IP192.168.0.3,我的硬件地址是mac-c。而且是大量的。
    所以A就会误信192.168.0.3的硬件地址是mac-c,而且动态更新缓存表
    这样主机C就劫持了主机A发送给主机B的数据,这就是ARP欺骗的过程。
    假如C直接冒充网关,此时主机C会不停的发送ARP欺骗广播,大声说:我的IP是192.168.0.1,我的硬件地址是mac-c,
    此时局域网内所有主机都被欺骗,更改自己的缓存表,此时C将会监听到整个局域网发送给互联网的数据报。

    请你讲一下路由器和交换机的区别?

    1、工作层次不同,一个是网络层、一个是数据链路层
    2、寻址依据不同,一个是基于IP寻址,一个基于MAC寻址
    3、交换机分割冲突域,不划分广播域,即隶属一个交换机的主机属于一个局域网。通过路由器连接的主机可能数据不同的广播域,所以路由器可以划分广播域
    4、转发的数据对象不同 ,交换机转发的是数据帧、路由器转发的是分组报文

    请你谈谈DNS的寻址过程

    (1)检查浏览器缓存、检查本地hosts文件是否有这个网址的映射,如果有,就调用这个IP地址映射,解析完成。
    (2)如果没有,则查找本地DNS解析器缓存是否有这个网址的映射,如果有,返回映射,解析完成。
    (3)如果没有,则查找填写或分配的首选DNS服务器,称为本地DNS服务器。服务器接收到查询时:
    如果要查询的域名包含在本地配置区域资源中,返回解析结果,查询结束,此解析具有权威性。
    如果要查询的域名不由本地DNS服务器区域解析,但服务器缓存了此网址的映射关系,返回解析结果,查询结束,此解析不具有权威性。
    (4)如果本地DNS服务器也失效:
    如果未采用转发模式(迭代),本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后,会判断这个域名(如.com)是谁来授权管理,并返回一个负责该顶级域名服务器的IP,本地DNS服务器收到顶级域名服务器IP信息后,继续向该顶级域名服务器IP发送请求,该服务器如果无法解析,则会找到负责这个域名的下一级DNS服务器(如http://baidu.com)的IP给本地DNS服务器,循环往复直至查询到映射,将解析结果返回本地DNS服务器,再由本地DNS服务器返回解析结果,查询完成。
    如果采用转发模式(递归),则此DNS服务器就会把请求转发至上一级DNS服务器,如果上一级DNS服务器不能解析,则继续向上请求。最终将解析结果依次返回本地DNS服务器,本地DNS服务器再返回给客户机,查询完成。

    在 MTU=1500 字节的以太网中,TCP 报文的最大载荷为多少字节?

    1500(MTU) - 20(IP 头大小) - 20(TCP 头大小)= 1460

    保留端口号

    小于1024的 TCP/UDP 端口号已保留与现有服务一一对应,此数字以上的端口号可自由分配

    怎么判断回绕的?

    如下的代码,普通情况,如果seq1小于seq2,相减的结果为负的,那么自然可以判断seq1在前面;如果发生回绕,实际上seq1是大于seq2的,但seq1-seq2得到一个非常大的值,最高位为1,得到的结果也是负的,同样得到seq1在前面。
    仔细想想,这是个很精妙的设计。

    static inline bool before(__u32 seq1, __u32 seq2)
    {
            return (__s32)(seq1-seq2) < 0;
    }
    

    怎么知道这是一条微信的消息还是QQ的消息?

    端口号跟进程绑定起来,所以是由端口号决定的

    收到 IP 数据包解析以后,它怎么知道这个分组应该投递到上层的哪一个协议(UDP 或 TCP)

    IP报文头中有两个字节用于表示传输层使用的协议类型

    TCP头里面是没有IP地址的

    TCP 的报文里是没有源 ip 和目标 ip 的,因为那是 IP 层协议的事情,TCP 层只有源端口和目标端口。
    源 IP、源端口、目标 IP、目标端口构成了 TCP 连接的「四元组」。一个四元组可以唯一标识一个连接。

    SACK选择ACK的过程

    SACK是TCP的一个选项,会选择性地确认收到了。以前的ACK是确认连续收到的。
    SACK是需要一开始的时候确认下双方支持这个功能的。

    TCP常用的选项有以下几个

    • MSS:最大段大小选项,是 TCP 允许的从对方接收的最大报文段
    • SACK:选择确认选项
    • Window Scale:窗口缩放选项

    建立的时候交换了哪些信息?

    SN(序列号)、窗口大小、MSS、其他选项(窗口因子)

    相关文章

      网友评论

          本文标题:Java面试——TCP/IP

          本文链接:https://www.haomeiwen.com/subject/twyzyhtx.html