1.TCP连接中断之后,服务器的socket应何时关闭

keep_alive特性需要再setsockopt里面把SO_KEEPALIVE标志设置为1,才会打开
image.png
image.png

输入URL到显示页面发生了什么

比如输入 http://www.baidu.com。其中http是协议,www.baidu.com是网络地址,首先是需要把网络地址转换成ip地址。

  • 客户端先检查本地DNS缓存是否有其对应的IP地址,如果有就返回响应的IP地址,如果没有则请求上级DNS服务器,直至找到或者到根节点
  • 客户端生成一个DNS查询报文,将网址这一字符串放入请求报文,然后将该请求报文放入一个UDP报文段,该UDP报文段的目的IP是dns服务器的IP
  • 该UDP报文将被放入一个以太帧中,然后传送到目标DNS服务器
  • DNS服务器接收到该以太帧后,将逐层提取出UDP报文段进而DNS查询报文
    然后检查是否存在该域名,存在则返回一个DNS应答报文,如果没有,则递归查询更高一级的DNS服务器。
  • 客户端从DNS应答报文中提取出ip地址,于是便可以生成TCP套接字,。客户端的便携机中的TCP必须和目标网站中的TCP进行三次握手,然后建立一个TCP连接。
  • 接着通过这个TCP连接,客户端向服务器发送HTTP请求报文,如果是http1.0协议,那么目标端口是80,如果是http1.1,目标端口是443.
  • 服务器接收到http请求报文后,先分析URI,报文里的GET或者是POST等字段,确定该HTTP请求的方法,然后提取出目标文件。接着分析HTTP头部,确定主机号,长连接或是短连接等信息,然后返回服务端需要的网页
  • 如果是长连接,那么tcp连接将保持,如果是短连接,tcp连接将在四次握手后关闭。

ping命令的整个过程

ping使用的是ICMP(internet控制报文协议)协议,发送主机发送echo请求,接收主机回应echo报文

首先要区分是在同一网段还是不同网段进行ping操作,如果是在同一网段,那么比如是主机Aping主机B,主机A首先检查本地的ARP表里面是否存储了B主机IP对应的MAC地址,如果找到了对应的MAC地址,那么就生成一个ICMP回显请求报文报文,主机B收到主机A的ICMP查询报文之后,会返回一个报文给主机A,这样就完成了ping的过程。

如果主机A没有主机B的mac地址,那么要发送ARP广播,B主机收到广播之后,会回应该报文,告诉主机A自己的mac地址

如果是在不同网段,那么它首先要学习网关的MAC地址,学习完之后,再封装echo报文发送给网关路由器,当路由器收到主机A发送的ICMP回显请求报文,发现其目的MAC地址是自己,就会查询主机B的对应路由表项,得到一个出口指针,去掉原来的MAC头部,然后加上自己的MAC地址,向下一个路由器转发,直至达到主机B,主机B收到主机A的ICMP回显报文后,会返回应答报文,应答报文到达主机A之后,就完成了ping的全过程。

ping可以测量往返时间,记录分组丢失,等信息。

通过子网掩码来判断是否在同一个子网

如果客户端和服务器用tcp传输数据的时候,交换机间歇性断电,服务器意外重启会发生什么

RST报文:

rst是tcp头部的一个字段,重置连接(连接取消,经常是因为错误)。用于复位某种原因引起的错误连接,也用来拒绝非法数据和请求。

发送RST包关闭连接时,不必等缓冲区的包都发出去,直接就丢弃缓冲区中的包,发送RST;接收端受到RST包后,也不必发送ASK包来确认。

产生的几种情景:

  • 目的地为某端口的SYN到达,然而该端口没有正在监听的服务器。
  • 请求超时
  • 想取消一个已存在的连接
  • 客户端在服务端已经关闭掉socket之后,仍然在发送数据
  • tcp接收到一个根本不存在的连接上的分节。!!!(服务器主机崩溃后重启,它的tcp连接丢失了崩溃前的所有连接信息,因此服务器TCP队友所有来自客户的数据分节响应一个RST)
    1.connect一个不存在的端口;
    2.向一个已经关掉的连接send数据;
    3.向一个已经崩溃的对端发送数据(连接之前已经被建立);
    4.close(sockfd)时,直接丢弃接收缓冲区未读取的数据,并给对方发一个RST。这个是由SO_LINGER选项来控制的;
    5.a重启,收到b的保活探针,a发rst,通知b。

交换机间歇断电:

拥塞控制??

网络编程中的TCP粘包问题

什么是包

在tcp开发应用的语境下,包有两种,其一是开发者在应用层封装的报文,其二是tcp协议在传输时封装的报文,分为包头和负载

什么是粘

  1. 因为TCP连接是面向流的协议,所以当使用send发送多次数据时,TCP协议并不会按照开发者的期望,按照每次send的数据量来确定发送数据的边界。所以接收端可能一次收到多个应用层报文,此时就需要应用开发者自己分开(UDP是面向报文的协议)
  2. 用户数据被TCP发出去的时候,存在多个小尺寸数据被封装在一个TCP报文中发出去可能性。这种情况实际上可以降低tcp报文头部的负载

解决

  1. 第一种粘包可以通过设计一个带有包头的应用层报文结构解决,包头定长,以特定标志开头,里面带着负载长度,这样接收端就可以通过以定长尝试读取包头,然后再按照包头里的负债长度来读取负载即可。
  2. 第一种粘包可以通过设置TCP_NOTDELAY来屏蔽NAGLE算法。避免tcp将多个报文合并到一个报文段中发送

网页跳转原理

在一个标签里面,将href设置成我们想要跳转到的文件名和路径,,或者是其他的网址,点击该标签,就会自动跳转到那个网页

子网掩码和ip地址的关系

子网掩码255,255,72,0 对应二进制为 11111111.11111111.1001000.00000000
一个主机的ip为201.222.10.60 那么网络地址就是子网掩码和主机ip的与

如果该主机要在子网进行广播,那么主机号全部设为1:11111111.11111111.1001+ 111.11111111
地址范围由网络地址的后一个和广播地址的前一个组成,主机数2 ^ n - 2;

2MSL

tcp报文段是以IP数据报的形式传输,IP数据报的有效生存时间被iP数据报中的TTL字段和跳数限制字段所限制

tcp_orphan_retries参数

超过这个次数放弃重传,进入close。默认为零,0指8次

Time Wait状态的目的

允许任何受制于一条关闭连接的数据报被丢弃。收到RST报文可以破坏这一状态。

半开连接

如果在未告知另一端的情况下,通信的一端关闭或终止连接,那么就认为该条TCP连接处于半开连接。

  1. 这种情况通常发生在通信一方主机崩溃的情况喜爱,只要不尝试通过半开连接传输数据,正常工作的一方将不会检测出另一端已经崩溃。
  2. 发生在某一台主机的电源被切断,而不是正常关机

有keepalive机制来探测,得到rst结果,因为服务器重启之后会丢失之前所有连接的记忆

输入URL发生的全过程

  1. 用DNS查询地址(DNS查询报文:主机IP,MAC地址,默认网关MAC地址,DNS服务器IP,网址)
  2. 在DNS查询地址之前要通过ARP查询报文查询网关路由器的MAC地址
  3. 获得IP地址之后,三次握手建立连接
  4. 发送一个HTTP get报文,这个get报文要包含前面输入的URL
  5. 服务器解析HTTP get报文,然后发送数据给用户
  6. 用户浏览器解析数据,渲染网页
  7. 如果是长连接,保持TCP连接,否则进行四次挥手,断开连接

    DNS域名解析过程

    域名解析过程一般分为递归查询recursive query和迭代查询iterative query

    递归查询

    此级域名服务器不知道结果时,代替请求端向下一个域名服务器发出查询请求,结果同理一层层返回;
  • 计算机网络场景知识 - 图3

为了提高效率、减轻根域名负荷以及减少因特网上DNS查询报文数量,域名服务器中广泛使用缓存。为了保证缓存中数据正确,服务器应当为每一项数据设置有效期

迭代查询

1.浏览器检查本地缓存是否存在改域名对应IP地址,如果存在检查是否有效TTL
2.检查系统缓存是否存在
3.请求本地域名服务器LDNS来解析这个域名
4.如果没有命中,那么跳到Root Server域名服务器进行解析
5.根域名服务器返回给本地域名服务器一个所查询域的主域名服务器(gTLD Server),比如国际顶尖域名服务器(.com,.cn)地址
6.本地域名服务器发送请求给上一步返回的gTLD
7.gTLD查找并返回这个域名对应Name Server的地址,这个Name Server就是网站注册的域名服务器
8.域名服务器根据映射关系表找到目标ip。返回给LDNS
9.LDNS把解析结果返回给用户,用户根据TTL值缓存到本地系统缓存中,域名解析结束。