计算机网络面试知识点总结

目录

一、TCP和UDP的区别

二、OSI七层网络模型

三、TCP/IP协议五层协议模型

四、五个术语

五、IP协议相关技术

六、TCP

七、TCP的流量控制以及拥塞控制

八、TCP协议如何来保证传输的可靠性

九、计算机网络中的网关和网桥

十、本机ip和127.0.0.1的区别

十一、常见的基于TCP/UDP的应用层协议

十二、连接计算机与计算机之间的一些硬件设备

十三、访问www.baidu.com的整个过程

十四、什么是域名?什么网站名?什么是URL?

十五、ping命令工作原理(转载)

十六、正向代理和反向代理

十七、分析一台主机不能上网的原因

十八、粘包问题以及解决方案

十九、IP地址的分类

二十、TCP soctet交互流程?

二十一、 解释RTO,RTT和超时重传?

一、TCP和UDP的区别

TCP协议:

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议

TCP协议的特点:

a.需要建立连接,传输数据,释放连接三个阶段

b.向上级提供有序的,可靠的,无差错的数据传输服务

UDP协议:

UDP是面向无连接,可以随时发送数据。不提供复杂的控制机制,利用IP提供面向无连接的通信服务。并且它是将应用程序发来的数据在收到的一刻,立即按照原样发送到网络上的一种机制。

UDP协议的特点:
 
a. 是无连接的。相比于TCP协议,UDP协议在传送数据前不需要建立连接,当然也就没有释放连接。
 
b.灵活方便比较迅速。
 
c.不会对报文重复的丢失、重复或无序进行处理

两者之间的区别

TCP是面向连接的,UDP是无连接的;
    TCP是可靠的,UDP是不可靠的;
    TCP只支持点对点通信,UDP支持一对一、一对多、多对一、多对多的通信模式;
    TCP是面向字节流的,UDP是面向报文的;
    TCP有拥塞控制机制;UDP没有拥塞控制,适合媒体通信;
    TCP首部开销(20个字节)比UDP的首部开销(8个字节)要大;
应用场景

TCP应用场景

当对网络通信质量有要求时,比如:整个数据要准确无误的传递给对方,这往往对于一些要求可靠的应用,比如HTTP,HTTPS,FTP等传输文件的协议,POP,SMTP等邮件的传输协议。常见使用TCP协议的应用: 

浏览器使用的:HHTP 
    FlashFXP:FTP 
    Outlook:POP,SMTP 
    QQ文件传输
UDP应用场景

对当前网络通讯质量要求不高的时候,要求网络通讯速度尽量的快,这时就使用UDP 。日常生活中常见使用UDP协议: 

DHCP
    TFTP
二、OSI七层网络模型

物理层:在物理层上所传数据的单位是比特。物理层的任务就是透明地传送比特流。

数据链路层:互联设备之间传送和识别数据帧。我们知道,两个主机之间的数据传输,总是在一段一段的链路上传送的,也就是说,在两个相邻结点之间传送数据是直接传送的(点对点),这时就需要使用专门的链路层的协议。

网络层:为数据包选择路由。

传输层:起着可靠传输的作用。只在通信双方节点上进行处理,而无需在路由器上处理。

会话层:负责建立和断开通信连接,以及数据的分割等数据传输相关的管理。

表示层:将应用处理的信息转换为适合网络传输的格式,或将来自下一层的数据转换为上层能够处理的格式。因此它主要负责数据格式的转换。

应用层:为应用程序提供服务并规定应用程序中通信相关的细节。包括文件传输、电子邮件、远程登陆等协议。

数据从A 的应用层往下走到物理层,会在每一层都会加上头部信息,进行封装,然后再发送到B。

然后 Server B 从 最下面的物理层往上 每一层进行解封装,最后到达应用层,得到数据。

三、TCP/IP协议五层协议模型

协议森林

硬件(物理层)
TCP/IP的最底层是负责数据传输的硬件,如以太网或者电话线路等物理设备。TCP/IP是在网络互联的设备之间能够通信的前提之下提出来的协议。

网络接口层(数据链路层)
网络接口层利用以太网中的数据链路层进行通信,因此属于接口层。也可以把它当作让NIC起作用的“驱动程序”。

互联网层(网络层)
互联网层使用IP协议,相当于OSI模型中的网络层。 
TCP/IP分层中的互联网层和传输层的功能通常是由操作系统提供。尤其是路由器,它必须得实现通过互联网层转发分组数据包的功能。此外,链接互联网的所有主机和路由器都必须实现IP的功能,其他连接互联网的网络设备就没必要一定实现IP或TCP的功能。

传输层
传输层最主要的功能就是要实现应用程序之间的通信。计算机的内部,通常同一时间运行着多个程序。为此,我们必须分清哪些程序与哪些程序正在进行通信,识别这些应用程序的是端口号。

TCP
TCP是一种面向有连接的传输协议。优点在于安全性高,缺点在于多次发包收包会浪费网络流量。

UDP
UDP是一种面向无连接的传输协议。优点在于程序简单,缺点在于安全性低。

应用层(会话层以上的分层)

应用层就是规定应用进程在通信时所遵循的协议

TCP/IP的分层中,将OSI参考模型中的会话层、表示层、应用层的功能都集中到了应用程序中实现。 

我这里简单介绍几个应用程序:


WWW
浏览器与服务器之间通信所用的协议是HTTP,它属于OSI应用层的协议。 
所传输数据的主要格式是HTML,它属于OSI表示层的协议。

电子邮件
发送电子邮件所用到的协议是SMTP,它只可以发送文本格式,后来电子邮件的格式由MIME协议扩展,就可以发送声音、图像等各种各样的信息。MIME也属于表示层的协议。

文件传输
文件传输指可以将其他计算机硬盘中的文件传输到本机上,或者相反的操作。文件传输所用的协议是FTP。

远程登录
远程登录是指登录到远程的计算机上,使那台计算机上的程序可以运行。 
TCP/IP网络中远程登录常用TELNET和SSH两种协议。

网络管理
在TCP/IP中进行网络管理时,采用SNMP协议。使用SNMP管理的主机、网桥、路由器等称作SNMP代理,而进行管理的那一段叫做管理器。SNMP就是管理器和代理之间要用到的协议。


四、五个术语

包:全能型数据,在哪一个层次都可以说。

帧:用于表示数据链路层中包的单位。

数据报:IP和UDP等网络层以上的分层中包的单位。

段:TCP数据流中的消息。

消息:应用协议中数据的单位。

五、IP协议相关技术

 IP的主要作用

(1)IP寻址

在计算机通信中,为了识别通信段,必须要有一个类似于地址的识别码进行标识。而在数据链路层,使用MAC地址来标识同一个链路中不同计算机的一种识别码。在网络层,则叫做IP地址。

(2)路由(最终节点为止的转发)

路由控制(Routing)是指将分组数据发送到最终目标地址的功能。即使网络非常复杂,也可以通过路由控制确定到达目标地址的通路。因此,一个数据包之所以能够成功地到达最终的目标地址,全靠路由控制。

Hop中文叫“跳”,它是指网络中的一个区间,IP包正是在网络中一个跳间被转发。数据链路实现某一个区间(一跳)内的通信,而IP实现直至最终目标地址的通信(点对点)。

(3)IP分包与组包

IP面向无连接,即在发包之前,不需要建立与对端目标地址之间的连接。上层如果遇到需要发送给IP的数据,该数据会被立即压缩成IP包发送出去。

IP为什么面向无连接:

1.简化:面向连接比起面向无连接处理相对复杂!

2.提速:每次通信之前都需要建立连接,会降低处理速度!

需要有连接时,可以委托上一层(传输层)提供此项服务,因此,IP为了实现简单化与高速化采用面向无连接方式。

DNS

DNS的产生

我们平常在访问某个网站时不使用IP地址,而是用一串罗马字和点号组成的字符串。能够这样做是因为有DNS,DNS可以将那串字符串自动转换为具体的IP地址。

所以DNS系统就是为了有效管理主机名和IP地址之间对应关系的系统。

域名的构成

在理解DNS规范时,首先需要了解什么是域名。域名是为了识别主机名称和组织机构名称的一种具有分层的名称。域名的范围要比主机名大,一个域名下可以有多个主机名,域名下还可以有子域名。例如域名abc.com下,有主机server1和server2,其主机名就是server1.abc.com和server2.abc.com。

域名的分层结构

DNS查询

DNS工作原理

在浏览器中输入www . qq .com 域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。
    如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。
    如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/ip参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。
    如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
    如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至根DNS服务器,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(qq.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找qq.com域服务器查询www.qq.com的ip地址,然后将查到的ip地址返回给客户端。
从客户端到本地DNS服务器是属于递归查询,而DNS服务器之间就是的交互查询就是迭代查询。

ARP

概要

只要确定了IP地址,就可以向这个目标地址发送IP数据报。然而,在底层数据链路层,进行实际通信时却有必要了解每个IP地址所对应的MAC地址。

ARP是一种解决地址问题的协议。以目标IP地址为线索,用来定位下一个应该接收数据分包的网络设备对应的MAC地址。如果目标主机不在同一个链路上时,可以通过ARP查找下一跳路由器的MAC地址。

ARP工作机制

主机A为了获得主机B的MAC地址,起初要通过广播发送一个ARP请求包。这个包中包含了想要了解其MAC地址的主机IP地址。如果ARP请求包中的目标IP地址与自己的IP地址一致,那么这个节点就将自己的MAC地址塞入响应包返回给主机A。

        网络层的ARP协议完成了IP地址与物理地址的映射。首先,每台主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址的对应关系。当源主机需要将一个数据包要发送到目的主机时,会首先检查自己ARP列表中是否存在该IP地址对应的MAC地址:如果有,就直接将数据包发送到这个MAC地址;如果没有,就向本地网段发起一个ARP请求的广播包,查询此目的主机对应的MAC地址。此ARP请求数据包里包括源主机的IP地址、硬件地址、以及目的主机的IP地址。网络中所有的主机收到这个ARP请求后,会检查数据包中的目的IP是否和自己的IP地址一致。如果不相同就忽略此数据包;如果相同,该主机首先将发送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARP表中已经存在该IP的信息,则将其覆盖,然后给源主机发送一个ARP响应数据包,告诉对方自己是它需要查找的MAC地址;源主机收到这个ARP响应数据包后,将得到的目的主机的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息开始数据的传输。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。

ARP 是解决同一个局域网上的主机或路由器的IP地址和硬件地址的映射问题。 如果所要找的主机和源主机不在同一个局域网上,那么就要通过 ARP 找到一个位于本局域网上的某个路由器的硬件地址,然后把分组发送给这个路由器,让这个路由器把分组转发给下一个网络。剩下的工作就由下一个网络来做。尽管ARP请求分组是广播发送的,但是ARP响应分组是普通的单播,即从一个源地址发送到一个目的地址。

ARP的4种典型情况总结:

发送方是主机,要把IP数据报发送到本网络上的另一个主机。这时用ARP找到目的主机的硬件地址。
    发送方是主机,要把 IP 数据报发送到另一个网络上的一个主机。这时用ARP找到本网络上的一个路由器的硬件地址。剩下的工作由这个路由器来完成。
    发送方是路由器,要把 IP 数据报转发到本网络上的一个主机。这时用ARP找到目的主机的硬件地址。
    发送方是路由器,要把 IP数据报转发到另一个网络上的一个主机。这时用ARP找到本网络上的一个路由器的硬件地址。剩下的工作由这个路由器来完成。
     
ICMP

功能

一个刚刚搭建好的网络,需要验证该网络的设置是否正确。ICMP(Internet Control Message Protocol)这是提供这类功能的一种协议,其主要功能包括:确认IP包是否成功送达目标地址,通知在发送过程中IP包被废弃的具体原因等等。例如我们经常使用ping命令,就是一个典型的ICMP的具体应用。

原理

在IP通信中如果某个IP包因为某种原因未能到达目标地址,那么这个具体的原因将由ICMP负责通知。主机A向主机B发送了数据包,由于某种原因,途中的路由器2未能发现主机B的存在,这时,路由器2就会向主机A发送一个ICMP包,说明发往主机B的包未能成功。

ICMP的这种通知消息会使用IP进行发送。因此,从路由器2返回的ICMP包会按照往常的路由控制先经过路由器1再转发给主机A。收到该ICMP包的主机A则分解ICMP的首部和数据域以后得知具体发生问题的原因。

ICMP差错报告报文用于目标主机或到目标主机路径上的路由器向源主机报告差错和异常情况,共有五种类型:

终点不可达
    源点抑制
    时间超时
    参数问题
    改变路由(重定向)
几种常见的ICMP报文:

响应请求:我们日常使用最多的ping,就是响应请求(Type=8)和应答(Code=0),一台主机向一个节点发送一个Type=8的ICMP报文,如果途中没有异常(例如被路由器丢弃、目标不回应ICMP或传输失败),则目标返回Type=0的ICMP报文,说明这台主机存在,更详细的tracert通过计算ICMP报文通过的节点来确定主机与目标之间的网络距离。
    时间戳:时间戳请求报文(Type=13)和时间戳应答报文(Type=14)用于测试两台主机之间数据报来回一次的传输时间。传输时,主机填充原始时间戳,接收方收到请求后填充接收时间戳后以Type=14的报文格式返回,发送方计算这个时间差。
ICMP的两个常见的应用是分组间间探测PING(用来测试两个主机之间的连通性)和traceroute(UNIX中的名字,在Windows中是tracert,可以用来跟踪分组经过的路由)。其中PING使用了ICMP回送报文和回答报文,traceroute(tracert)使用了ICMP时间超过报文。PING工作在应用层,它直接使用网络层的ICMP协议,而没有使用传输层的TCP或UDP协议。Traceroute/tracert工作在网络层。

DHCP

动态主机配置协议常用于给主机动态地分配IP地址,它提供了即插即用联网的机制,这种机制允许一台计算机加入新的网络和获取IP地址而不用手工参与。DHCP是应用层协议,基于UDP的。

工作原理:

它使用客户/服务器方式。需要IP地址的主机在启动时就向DHCP服务器广播发送发现报文,这时该主机就称为DHCP客户。本地网络上所有主机都能收到此广播报文,但只有DHCP服务器才回答此广播报文。DHCP服务器先在其数据库中查找该计算机的配置信息。若找到,则返回找到的信息。若找不到,则从服务器的IP地址池中取一个地址分配给该计算机。DHCP服务器的回答报文叫做提供报文。

DHCP服务器和DHCP客户端的交换过程如下:

DHCP客户机广播“DHCP发现”消息,试图找到网络中的DHCP服务器,以便从DHCP服务器获得一个IP地址。由于DHCP客户机还未配置IP地址,它只能使用广播方式发送消息,并且源IP地址设置为0.0.0.0。
    DHCP服务器收到“DHCP发现”消息后,就向网络中广播“DHCP供给”消息,其中包括提供给DHCP客户机的IP地址和相关配置信息。
    DHCP客户机收到“DHCP供给”消息,如果接受DHCP服务器所提供的相关参数,就通过广播“DHCP请求”向DHCP服务器请求提供IP地址。
    DHCP服务器广播“DHCP确认”消息,将IP地址分配给DHCP客户机。
注意

1.DHCP服务器分配给DHCP客户的IP地址是临时的,因此DHCP客户只能在一段有限的时间内使用这个分配到的IP地址。

2.DHCP协议的客户端和服务端需要通过广播方式来进行交互,原因是在DHCP协议执行期间,客户端和服务端都没有标识自已身份的IP地址,因此不可能通过单播的形式进行交互。采用UDP而不采用TCP的原因也很明显,TCP协议需要建立连接,如果连对方的IP地址都不知道,更不可能通过双方的套接字建立连接了。

NAT

定义

NAT是用于在本地网络中使用私有地址,在连接互联网时转而使用全局IP地址的技术。除转换IP地址外,还出现了可以转换TCP、UDP端口号的NAPT(窗口多路复用)技术,由此可以实现一个全局IP地址与多个主机的通信。

实现方式

NAT的实现方式有三种,即静态转换Static Nat、动态转换Dynamic Nat和端口多路复用OverLoad。

静态转换是指将内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一的,是一成不变的,某个私有IP地址只转换为某个公有IP地址。借助于静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问。

动态转换是指将内部网络的私有IP地址转换为公用IP地址时,IP地址是不确定的,是随机的,所有被授权访问上Internet的私有IP地址可随机转换为任何指定的合法IP地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行动态转换。动态转换可以使用多个合法外部地址集。当ISP提供的合法IP地址略少于网络内部的计算机数量时。可以采用动态转换的方式。当私有网络内的多台机器都要与外部进行通信时,仅仅转换IP地址,全局IP地址还是不够用的。可以用下面的端口多路复用。

端口多路复用( Port address Translation,PAT)是指改变外出数据包的源端口并进行端口转换,即端口地址转换(PAT,Port Address Translation).采用端口多路复用方式。内部网络的所有主机均可共享一个合法外部IP地址实现对Internet的访问,从而可以最大限度地节约IP地址资源。同时,又可隐藏网络内部的所有主机,有效避免来自internet的攻击。因此,目前网络中应用最多的就是端口多路复用方式。

六、TCP

TCP使用端口号提供进程到进程间的通信。下面是一些熟知端口号。

TCP使用的熟知端口号
    端口
            协议
            说明
        7
            Echo
            把收到的数据报回送到发送发
        9
            Discard
            丢弃收到的任何数据报
        11
            User
            活跃的用户
        13
            Daytime
            返回日期和时间
        17
            Quote
            返回日期的引用
        19
            Chargen
            返回字符串
        20和21
            FTP
            文件传送协议(控制和数据)
        23
            TELNET
            终端网络
        25
            SMTP
            简单邮件传送协议
        53
            DNS
            域名服务器
        67
            BOOTP
            引导程序协议
        79
            Finger
            Finger
        80
            HTTP
            超文本传送协议
        TCP三次握手

通过序列号与确认应答提高可靠性

序列号是按顺序给发送数据的每一个字节都标上号码的编号。接收端查询接收数据TCP首部中的序列号和数据的长度,将自己下一步应该接收的序列号作为确认应答返送回去。就这样,通过序列号和确认应答号,TCP可以实现可靠传输。

流程

SYN: 表示建立连接

FIN: 表示关闭连接

ACK: 表示响应

PSH: 表示有 DATA数据传输

RST: 表示连接重置。

TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态;
    TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这是报文首部中的同部位SYN=1,同时选择一个初始序列号 seq=x ,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。
    TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。
    TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。
    当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了。 
为什么TCP客户端最后还要发送一次确认呢?

一句话,主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。

如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。

如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。

三次握手过程中做了哪些准备工作?

1.双方的初始序列号

2.窗口协议,即双方的接收窗口的大小

3.最大的报文段的长度

三次握手过程中第三个报文能否携带数据?

RFC793文档里带有SYN标志的过程包是不可以携带数据的,也就是说三次握手的前两次是不可以携带数据的(逻辑上看,连接还没建立,携带数据好像也有点说不过去)。而第三次握手的ACK包在标准中明确规定可以携带数据。

三次握手之间可能存在什么攻击以及如何防御?

Syn_Flood攻击:

SYN-FLOOD是一种常见的DDos攻击,拒绝服务攻击。通过网络服务所在的端口发送大量伪造原地址的攻击报文,发送到服务端,造成服务端上的半开连接队列被占满,从而阻止其他用户进行访问。 
它的数据报特征是大量syn包,并且缺少最后一步的ACK回复。

原理:攻击者首先伪造地址,对服务器发起syn请求,服务器回应syn+ACK,而真实的IP会认为我没有发送请求,不做回应,而服务端没有收到回应,服务器就不知道是否发送成功,默认情况下重试5次 syn_retries,这样的话,对于服务器内存和带宽有很大的消耗。

cookie源认证:  

原理是syn报文首先由DDOS防护系统来响应syn_ack。带上特定的sequence number (记为cookie)。真实的客户端会返回一个ack 并且Acknowledgment number 为cookie+1。 而伪造的客户端,将不会作出响应。这样我们就可以知道那些IP对应的客户端是真实的,将真实客户端IP加入白名单。下次访问直接通过,而其他伪造的syn报文就被拦截。下面为防护示意图: 

TCP四次挥手


     

客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
    服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
    客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
    服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
    客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
    服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
为什么建立连接是3次握手,而断开连接是4次握手?

建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。 
而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。

为什么客户端最后还要等待2MSL?

保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。
    防止“已失效的连接请求报文段”出现在本连接中。A在发送完最后一个ACK报文段后,再经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。
MSL 是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。ip头中有一个TTL域,TTL是 time to live的缩写,中文可以译为“生存时间”,这个生存时间是由源主机设置初始值但不是存的具体时间,而是存储了一个ip数据报可以经过的最大路由数,每经 过一个处理他的路由器此值就减1,当此值为0则数据报将被丢弃,同时发送ICMP报文通知源主机。RFC 793中规定MSL为2分钟,实际应用中常用的是30秒,1分钟和2分钟等。
    TTL与MSL是有关系的但不是简单的相等的关系,MSL要大于等于TTL。

TIME_WAIT状态对大并发服务器的影响

 在高并发短连接的TCP服务器上,当服务器处理完请求后立刻主动正常关闭连接。这个场景下会出现大量socket处TIME_WAIT状态。如果客户端的并发量持续很高,此时部分客户端就会显示连接不上。我来解释下这个场景。主动正常关闭TCP连接,都会出现TIMEWAIT。

为什么我们要关注这个高并发短连接呢?有两个方面需要注意:

1. 高并发可以让服务器在短时间范围内同时占用大量端口,而端口有个0~65535的范围,并不是很多,刨除系统和其他服务要用的,剩下的就更少了。

2. 在这个场景中,短连接表示“业务处理+传输数据的时间 远远小于 TIMEWAIT超时的时间”的连接。

      这里有个相对长短的概念,比如取一个web页面,1秒钟的http短连接处理完业务,在关闭连接之后,这个业务用过的端口会停留在TIMEWAIT状态几分钟,而这几分钟,其他HTTP请求来临的时候是无法占用此端口的(占着茅坑不拉翔)。单用这个业务计算服务器的利用率会发现,服务器干正经事的时间和端口(资源)被挂着无法被使用的时间的比例是 1:几百,服务器资源严重浪费。(说个题外话,从这个意义出发来考虑服务器性能调优的话,长连接业务的服务就不需要考虑TIMEWAIT状态。同时,假如你对服务器业务场景非常熟悉,你会发现,在实际业务场景中,一般长连接对应的业务的并发量并不会很高。

time_wait状态如何避免

1.应尽可能在服务端避免出现TIME_WAIT状态,如果服务器端主动断开连接,服务器端就会进入TIME_WAIT状态。所以在协议设计上,应该让客户端主动断开连接,这样就把TIME_WAIT状态分散到大量的客户端。如果客户端不活跃了,一些客户端不断开连接,这样就会占用服务器端的连接数量,服务器端也要(close)掉不活跃的连接。

2.服务器可以设置SO_REUSEADDR套接字选项来通知内核,如果端口忙,但TCP连接位于TIME_WAIT状态时可以重用端口。在一个非常有用的场景就是,如果你的服务器程序停止后想立即重启,而新的套接字依旧希望使用同一端口,此时SO_REUSEADDR选项就可以避免TIME_WAIT状态。

为什么TCP在建立连接时不能每次都选择相同的、固定的序列号?

如果TCP在建立连接时每次都选择相同的、固定的初始序号,那么设想以下的情况:

(1)假定主机A和B频繁地建立连接,传送一些TCP报文段后,再释放连接,然后又不断地建立新的连接、传送报文段和释放连接。
(2)假定每一次建立连接时,主机A都选择相同的、固定的初始序号,例如,选择1。
(3)假定主机A发送出的某些TCP报文段在网络中会滞留较长的时间,以致造成主机A超时重传这些TCP报文段。
(4)假定有一些在网络中滞留时间较长的TCP报文段最后终于到达了主机B,但这时传送该报文段的那个连接早已释放了.而在到达主机B时的TCP连接是一条新的TCP连接。

这样,工作在新的TCP连接下的主机B就有可能会接受在旧的连接传送的、已经没有意义的、过时的TCP报文段(因为这个TCP报文段的序号有可能正好处在现在新的连接所使用的序号范围之中)。结果产生错误。

因此,必须使得迟到的TCP报文段的序号不处在新的连接中所使用的序号范围之中。

这样,TCP在建立新的连接时所选择的初始序号一定要和前面的一些连接所使用过的序号不一样。因此,不同的TCP连接不能使用相同的初始序号。

TCP以段位单位发送数据

在建立TCP连接的同时,也可以确定发送数据包的单位,称之为“最大消息长度”:MSS。最理想的情况是,最大消息长度MSS正好是IP层中不被分片处理的最大数据长度。

TCP在传送大量数据的时候,是以“段=MSS的大小”将数据进行分割发送的,进行重发时也是以MSS为单位的。

最大消息长度——MSS是在三次握手的时候,在两端主机之间被计算得出的。两端主机在发出“建立TCP连接请求的SYN包”时,会在SYN包的TCP首部中写入MSS选项,告诉对方自己所能够适应的MSS的大小,然后发送端主机会在两者之间选择一个较小的MSS值投入使用。

利用窗口控制提高速度

TCP是以一个段为单位进行数据的传输的,每发送一个段,就会等待对端主机的针对这个段的确认应答信号ACK,但这样的传输方式的缺点也很明显,就是:当数据包的往返时间越长,通信性能越低。

为了解决这个问题,TCP引入了窗口这个概念,即使在往返时间比较长的情况下,它也能够控制网络性能的下降。如图7 所示:确认应答包不再以每个段为单位进行确认了,而是以更大的单位进行确认,转发时间将会被大幅度的缩短。也就是说,发送端主机在发送了一个段之后,没必要一直等待对端主机的确认应答信号,而是继续发送。

窗口大小,指的就是无需等待接收端主机的确认应答信号而可以持续发送的数据的最大值,或者说段的最大值,如图所示的窗口大小是4 个段。动窗口控制的实现,使用了大量的缓冲区,通过对多个段的数据同时进行确认应答来实现高效传输。

窗口控制和重发控制

在使用了窗口控制中,如果出现段丢失怎么办?

首先,我们先考虑接收端已经收到数据包只是反馈的确认应答包ACK包在途中丢失了的情况。

如图所示:在这种情况下,数据是已经被对端主机成功接收了的,是不需要进行重新发送的。然而,在没有使用窗口控制的前提下,没有收到确认应答包的数据包都会被重发。但是,在使用了窗口控制以后,就如图所示,某些确认应答包即使丢失了也无需重发,这也提高了传输效率。

其次,我们再来考虑一下某个数据包丢失的情况。

如果当接收端主机接收到一个自己应该接收的序列号之外的数据包时,它会一直对当前接收到的数据包返回确认应答包。

因此,如图所示:当某一个数据包丢失以后,发送端会一直接收到序列号为1001的确认应答包,这个确认应答包好像是在提醒发送端主机“我现在想要接收的数据包序列号是1001开始的”。

因此,在滑动窗口比较大的情况下,同一个序列号的确认应答将会被重复不断地返回。而发送端主机如果 连续3次接收到同一个确认应答包,就会将其对应的数据重发,这种机制比之前提到的“超时重发”更加高效,所以被称之为“高速重发控制”。

拥塞控制

(1)有了TCP的滑动窗口控制,收发主机之间即使不再以一个“段”为单位发送确认应答信号,也能够连续发送大量数据包。然而,如果在通信刚开始的时候就发送大量的数据包,也有可能会导致其他问题。

问题的发生: 要知道,计算机网络都处在一个共享的环境中,因此也有可能是因为其他的主机之间的通信使得整个网络出现拥堵。所以,在网络拥堵时,如果突然发送一个较大量的数据包,极有可能导致网络的瘫痪。

(2)TCP为了防止这种问题的发生,在通信一开始的时候会通过一个叫做“慢启动”的算法对发送的数据量进行控制。

首先,为了在发送端调节所要发送的数据量,定义了一个叫做“拥塞窗口”的概念。于是,在慢启动刚开始的时候,把这个拥塞窗口设置为1个MSS(1个数据段)发送数据,之后每收到一个接收端主机的确认应答信号ACK包 就把这个拥塞窗口的数值加1。然后,在发送数据的时候,把拥塞窗口和滑动窗口的大小作比较,按照它们当中较小的那个值来发送比其还要小的数据量。

不过,随着数据包的每次的往返,拥塞窗口会以1、2、4、8等指数函数的增长,拥堵状况激增甚至导致网络拥塞的发生。为了防止这些,又引入了“慢启动阈值”的概念,只要拥塞窗口超过这个阈值,在每收到一个ACK包的时候,只允许以下面这种方式来增大拥塞窗口:(1个数据段的字节数的平方 / 拥塞窗口的字节数)。这样的话,拥塞窗口越大,确认应答的数目也会增加,但是其涨幅却逐渐减少,因此会导致拥塞窗口是直线形式的上升。

TCP在刚开始通信的时候,并没有设置慢启动阈值,而是在超时重发时,才会把慢启动阈值设置为当前窗口的一半大小。

(3)由重复确认应答而触发的高速重发与超时重发机制的处理是不一样的。因为前者要求至少 3 次的确认应答包到达对方主机才会触发,相比后者网络拥堵的程度较轻一些。

而由重复确认应答进行高速重发控制时,慢启动阈值的大小被设置为当时窗口大小的一半,然后将窗口大小设置为该慢启动阈值+3个MSS的大小。

(4)有了这样的一种控制过之后,TCP的拥塞窗口的变化曲线 如图所示。由于窗口的大小会直接影响数据被转发的吞吐量,所以一般情况下,窗口越大,越会形成高吞吐量的通信。

七、TCP的流量控制以及拥塞控制

流量控制

滑动窗口

    TCP 采用大小可变的滑动窗口进行流量控制(窗口大小的单位是字节), 在 TCP 报文段首部的窗口字段写入的数值就是当前给对方设置的发送窗口数值的上限。发送窗口在连接建立时由双方商定。但在通信的过程中,接收端可根据自己的资源情况,随时动态地调整对方的发送窗口上限值(可增大或减小)。

流量控制过程

TCP提供了流量控制服务以消除发送方使接收方缓存区溢出的可能性,因此可以说流量控制是一个速度匹配服务(匹配发送方的发送速率与接收方的读取速率)。

    在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,这就是接收窗口rwnd,即调整TCP报文段首部中的“窗口”字段值,来限制发送方向网络注入报文的速率。同时,发送方根据其对当前网络拥塞程序的估计而确定的窗口值,称为拥塞窗口cwnd,其大小与网络的带宽和时延密切相关。

例如,在通信中,有效数据只从A发往B,而B仅向A发送确认报文,这时,B就可以通过设置确认报文段首部的窗口字段来将rwnd通知给A。rwnd即接收方允许连续接收的最大能力,单位是字节。发送方A总是根据最新收到的rwnd值来限制自己发送窗口的大小,这样可以将未确认的数据量控制在rwnd大小之内,保证了A不会使B的接收缓冲溢出。当然,A的发送窗口的实际大小是取rwnd和cwnd中的最小值。

拥塞控制

计算机网络中的带宽、交换结点中的缓存及处理机等都是网络的资源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏,这种情况就叫做拥塞。拥塞控制就是 防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载。注意,拥塞控制和流量控制不同,前者是一个全局性的过程,而后者指点对点通信量的控制。拥塞控制的方法主要有以下四种:

1). 慢启动:不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小;开始发送方先设置cwnd(拥塞窗口)=1,发送第一个报文段M1,接收方接收到M1后,发送方接收到接收方的确认后,把cwnd增加到2,接着发送方发送M2、M3,发送方接收到接收方发送的确认后cwnd增加到4,慢启动算法每经过一个传输轮次(认为发送方都成功接收接收方的确认),拥塞窗口cwnd就加倍。

2). 拥塞避免:为了防止cwnd增加过快而导致网络拥塞,所以需要设置一个慢开始门限ssthresh状态变量;

当cwnd < ssthresh,使用慢启动算法,

当cwnd > ssthresh,使用拥塞控制算法,停用慢启动算法。

当cwnd = ssthresh,这两个算法都可以。

拥塞避免算法让拥塞窗口缓慢增长,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍,这样拥塞窗口按线性规律缓慢增长。

网络拥塞时的处理

无论是在慢开始阶段还是在拥塞避免阶段,只要发送发检测到超时事件的发生(没有按时收到确认,重传计时器超时),就要把满开始门限ssthresh设置为出现拥塞时的发送发cwnd值的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。

3). 快重传:快重传要求接收方在收到一个 失序的报文段 后就立即发出 重复确认(为的是使发送方及早知道有报文段没有到达对方)而不要等到自己发送数据时捎带确认。快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。

4). 快恢复:快重传配合使用的还有快恢复算法,当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半,但是接下去并不执行慢开始算法:因为如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞。所以此时不执行慢开始算法,而是将cwnd设置为ssthresh的大小,然后执行拥塞避免算法。

由于跳过了xwnd从1起始的满开始过程,所以被称为快恢复。如下图所示。

结合博文拥塞控制

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

拥塞控制是让网络能够承受现有的网络负荷,它是一个全局性的过程,涉及所有的主机、所有的路由器,以及降低网络传输性能相关的所有因素。相反,流量控制往往是点对点的通信量的控制,即接收端控制发送端,它所要做的就是抑制发送端发送数据的效率,以便使接收端来得及接收。
    流量控制需要通信双方各维护一个发送窗、一个接收窗,对任意一方,接收窗大小由自身决定,发送窗大小由接收方响应的TCP报文段中窗口值确定;拥塞控制的拥塞窗口大小变化由试探性发送一定数据量数据探查网络状况后而自适应调整。
当然拥塞控制和也有流量控制相似的地方,都是通过控制发送方发送数据的速率来达到效果的。

八、TCP协议如何来保证传输的可靠性

TCP提供一种面向连接的、可靠的字节流服务。其中,面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。在一个TCP连接中,仅有两方进行彼此通信;而字节流服务意味着两个应用程序通过TCP链接交换8bit字节构成的字节流,TCP不在字节流中插入记录标识符。

对于可靠性,TCP通过以下方式进行保证:

数据包校验:目的是检测数据在传输过程中的任何变化,若校验出包有错,则丢弃报文段并且不给出响应,这时TCP发送数据端超时后会重发数据;

对失序数据包重排序:既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。TCP将对失序数据进行重新排序,然后才交给应用层;

丢弃重复数据:对于重复数据,能够丢弃重复数据;

应答机制:当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒;这样做的目的有两个:(1)这样做的目的是ACK是可以合并的,也就是指如果连续收到两个TCP包,并不一定需要ACK两次,只要回复最终的ACK就可以了,可以降低网络流量。(2)如果接收方有数据要发送,那么就会在发送数据的TCP数据包里,带上ACK信息。这样做,可以避免大量的ACK以一个单独的TCP包发送,减少了网络流量。

超时重发:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段;

流量控制:TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这可以防止较快主机致使较慢主机的缓冲区溢出,这就是流量控制。TCP使用的流量控制协议是可变大小的滑动窗口协议。在TCP首部中,专门有一个字段用来通知窗口大小。接收主机将自己可以接收的缓冲区大小放入这个字段中通知给发送端。这个字段的值越大,说明网络的吞吐量越高。

九、计算机网络中的网关和网桥

什么是网关?

网关是OSI参考模型中负责将从传输层到应用层的数据进行转换和转发的设备。它与4~7层交换机一样都是处理传输层及以上的数据,但是网关不仅转发数据还负责对数据进行转换,它通常会使用一个表示层或应用层网关,在两个不能进行直接通信的协议之间进行翻译,最终实现两者之间的通信。比如互联网邮件和手机邮件之间的转换服务。手机邮件可能与互联网邮件互不兼容,这是由于他们在表示层和应用层中的“电子邮件协议”互不相同而导致的。那么,为什么连到互联网的电脑和手机之间能够互相转发邮件呢?因为在互联网的电脑与手机之间设置了一道网关。网关负责读取完各种不同的协议后,对它们进行转换,然后发送出去。这样即使应用的是不同电子邮件的协议,计算机与手机之间也能互相发送邮件。

连接两个不同的网络的设备都可以叫网关设备;

网关设备可以是 交互机(三层及以上才能跨网络)、路由器、启用了路由协议的服务器、代理服务器、防火墙等

网关地址就是网关设备的IP地址。

假设我们有两个网络:

    网络A的IP地址范围为“192.168.1.1~192.168.1.254”,子网掩码为255.255.255.0

网络B的IP地址范围为“192.168.2.1~192.168.2.254”,子网掩码为255.255.255.0

要实现这两个网络之间的通信,则必须通过网关。

如果网络A中的主机发现数据包的目的主机不在本地网络中,就把数据包转发给它自己的网关,再由网关转发给网络B的网关,网络B的网关再转发给网络B的某个主机(如附图所示)。网络A向网络B转发数据包的过程。

只有设置好网关的IP地址,TCP/IP协议才能实现不同网络之间的相互通信。

默认网关 

一台主机可以有多个网关。默认网关的意思是一台主机如果找不到可用的网关,就把数据包发给默认指定的网关,由这个网关来处理数据包。现在主机使用的网关,一般指的是默认网关。

什么是网桥?

网桥是一个局域网与另一个局域网之间建立连接的桥梁。网桥是属于数据链路层的一种设备,它的作用是扩展网络和通信手段,在各种传输介质中转发数据信号,扩展网络的距离,同时又有选择地将有地址的信号从一个传输介质发送到另一个传输介质,并能有效地限制两个介质系统中无关紧要的通信。

十、本机ip和127.0.0.1的区别

1.本地ip和127.0.0.1都是ip地址, 只是127.0.0.1比较特殊, 发送到127.0.0.1的数据或者从127.0.0.1返回的数据只会在本机进行传输, 而不进行外部网络传输;

2.127.0.0.1主要有以下两个作用

测试本机网络
当我们可以ping通127.0.0.1的时候, 则说明本机的网卡以及tcp/ip协议族被正确安装了。

测试编写的网络应用
我们可以将本地ip和127.0.0.1分别看做客户端和服务器的ip地址, 然后在一台电脑上完成client/server应用的测试。

3.当涉及到计算机间的网络通信时, 则使用本机ip 。

127.0.0.1,通常被称为本地回环地址(Loop back address),不属于任何一个有类别地址类。它代表设备的本地虚拟接口,所以默认被看作是永远不会宕掉的接口。在windows操作系统中也有相似的定义,所以通常在安装网卡前就可以ping通这个本地回环地址。一般都会用来检查本地网络协议、基本数据接口等是否正常的。

十一、常见的基于TCP/UDP的应用层协议

使用TCP协议的常见端口主要有以下几种:

 (1) FTP:定义了文件传输协议,使用21端口。常说某某计算机开了FTP服务便是启动了文件传输服务。下载文件,上传主页,都要用到FTP服务。

(2) Telnet:它是一种用于远程登陆的端口,用户可以以自己的身份远程连接到计算机上,通过这种端口可以提供一种基于DOS模式下的通信服务。如以前的BBS是-纯字符界面的,支持BBS的服务器将23端口打开,对外提供服务。

(3) SMTP:定义了简单邮件传送协议,现在很多邮件服务器都用的是这个协议,用于发送邮件。如常见的免费邮件服务中用的就是这个邮件服务端口,所以在电子邮件设置-中常看到有这么SMTP端口设置这个栏,服务器开放的是25号端口。

(4) POP3:Post Office Protocol 3的简称,即邮局协议的第3个版本,它是和SMTP对应,POP3用于接收邮件。通常情况下,POP3协议所用的是110端口。也是说,只要你有相应的使用POP3协议的程序(例如Fo-xmail或Outlook),就可以不以Web方式登陆进邮箱界面,直接用邮件程序就可以收到邮件(如是163邮箱就没有必要先进入网易网站,再进入自己的邮-箱来收信)。

 (5)HTTP:这是大家用得最多的协议,它就是常说的"超文本传输协议"。上网浏览网页时,就得在提供网页资源的计算机上打开80号端口以提供服务。常说"WWW服-务"、"Web服务器"用的就是这个端口。

 使用UDP协议端口常见的有:

(1)RIP:是距离向量型的一种路由协议。(每隔一段时间,路由器会向所有邻居结点发送它到每个目的结点的距离表,同时它也接收每个邻居结点发来的距离表。这样以此类推,经过一段时间后便可将网络中各路由器所获得的距离矢量信息在各路由器上统一起来,这样各路由器只需要查看这个距离矢量表就可以为不同来源分组找到一条最佳的路由。)

(2) DNS:用于域名解析服务,这种服务在Windows NT系统中用得最多的。因特网上的每一台计算机都有一个网络地址与之对应,这个地址是常说的IP地址,它以纯数字+"."的形式表示。然而这却不便记忆,于是出-现了域名,访问计算机的时候只需要知道域名,域名和IP地址之间的变换由DNS服务器来完成。DNS用的是53号端口。

(3) SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。

十二、连接计算机与计算机之间的一些硬件设备

网卡

任何一台计算机连接网络时,必须要使用网卡。网卡是工作在链路层的网络组件,是局域网中连接计算机和传输介质的接口,不仅能实现与局域网传输介质之间的物理连接和电信号匹配,还涉及帧的发送与接收、帧的封装与拆封、介质访问控制、数据的编码与解码以及数据缓存的功能等。

中继器

中继器是在OSI模型的第一层--物理层面上的连接网络的设备。由电缆传过来的电信号或光信号经由中继器的波形调整和放大再传给另一个电缆。一般情况下,中继器的两端连接的是相同的通信媒介,但有的中继器也可以完成不同媒介之间的转换工作。例如,可以在同轴电缆与光缆之间调整信号。

网桥/2层交换机

网桥是在OSI模型的第二层--数据链路层上连接两个网络的设备。它能够识别数据链路层中的数据帧,并将这些数据帧临时存储域内存,在重新生成信号作为一个全新的帧转发给相连的另一个网段。

有些网桥能够判断是否将数据报文转发给相邻的网段,这种网段被称为自学式网桥。这类网桥会记住曾经通过自己转发的所有数据帧的MAC地址,并保存到自己的内存表里。由此,可以判断哪个网段中包含持有哪类MAC地址的设备。

注意:用转发器或桥接器(网桥等)连接起来的若干个LAN仍然是同一个网络(同一个广播域),因此该LAN中所有主机的IP地址的网络号必须相同,但主机号必须不同。

路由器/3层交换机 

路由器是在OSI模型的第3层--网络层面上连接两个网络、并对分组报文进行转发的设备。网桥是根据物理地址进行处理,而路由器/3层交换机则是根据IP地址进行处理。

路由器可以连接不同的数据链路。比如两个以太网、一个以太网与一个FDDI。

在一个互联网总,能否用一个很大的交互机来代替互联网中的很多的路由器?

这时不行的。交换机和路由器的功能是不同的。交换机可在单个网络中与若干台计算机相连,并且可以将一台祭祀安吉发送过来的帧转发给另一台计算机。从这一点上看,交换机具有集线器的转发帧的功能,但交换机比集线器的功能强跟多。在同一时间,集线器只允许一台计算机发送数据。

路由器连接两个或多个同构的或异构的网络,在网络之间转发分组(即IP数据报)。 

因此,如果是许多相同类型的网络互联在一起,那么用一个很大的交换机代替原来的一些路由器是可以的。但若这些互联的网络是异构的网络,就必须使用路由器来进行互联。

4~7层交换机

4-7层交换机负责处理OSI模型中从传输层到应用层的数据,如果用TCP/IP分层模型来表述,4-7层就是TCP等协议的传输层及其上面的应用层为基础,分析收发数据,并对其进行特定的处理。

其实际的应用场景:

均衡负载器。并发访问量非常大的一个企业级Web站点使用一台服务器不足以满足前段的访问需求,这时通常会假设多台服务器来分担。这些服务器前端访问的入口地址通常只有一个(企业为了使用者的方便,只会向最终用户开放一个统一的访问的URL )。为了能通过同一个URL将前段访问分发到后台多个服务上,可以在这些服务期的前端加一个负载均衡器,这种均衡器就是4~7层交换机中的一种。

带宽控制。实际通信中人们希望在网络比较拥堵的时候,优先处理像语音这类对及时性要求较高的通信请求放缓处理像邮件或者数据转发等稍有延迟也并无大碍的通信请求。这种处理被称为带宽控制,也是4~7层交换机的重要功能。

网关

网关是OSI参考模型中负责将从传输层到应用层的数据进行转换和转发的设备。它与4~7层交换机一样都是处理传输层及以上的数据,但是网关不仅转发数据还负责对数据进行转换,它通常会使用一个表示层或应用层网关,在两个不能进行直接通信的协议之间进行翻译,最终实现两者之间的通信。比如互联网邮件和手机邮件之间的转换服务。手机邮件可能与互联网邮件互不兼容,这是由于他们在表示层和应用层中的“电子邮件协议”互不相同而导致的。那么,为什么连到互联网的电脑和手机之间能够互相转发邮件呢?因为在互联网的电脑与手机之间设置了一道网关。网关负责读取完各种不同的协议后,对它们进行转换,然后发送出去。这样即使应用的是不同电子邮件的协议,计算机与手机之间也能互相发送邮件。

汇总

十三、访问www.baidu.com的整个过程

https://blog.csdn.net/huangwei18351/article/details/81456228

十四、什么是域名?什么网站名?什么是URL?

https://jingyan.baidu.com/article/2c8c281df0afd00008252aa7.html

http://mail.163.com/index.html

http://:这个是协议,也就是HTTP超文本传输协议,也就是网页在网上传输的协议。
    mail:这个是服务器名,代表着是一个邮箱服务器,所以是mail.
    163.com:这个是域名,是用来定位网站的独一无二的名字。
    mail.163.com:这个是网站名,由服务器名+域名组成。
    /:这个是根目录,也就是说,通过网站名找到服务器,然后在服务器存放网页的根目录
    index.html:这个是根目录下的默认网页(当然,163的默认网页是不是这个我不知道,只是大部分的默认网页,都是index.html)
    http://mail.163.com/index.html:这个叫做URL,统一资源定位符,全球性地址,用于定位网上的资源。
十五、ping命令工作原理(转载)

PING的工作流程 我们以下面一个网络为例:有 A、B、C、D 四台机子,一台路由 RA,子网掩码均为 255.255.255.0,默认路由为 192.168.0.1 [1]

1.在同一网段内

 在主机 A 上运行“Ping 192.168.0.5”后,都发生了些什么呢? 首先,Ping 命令会构建一个 固定格式的 ICMP 请求数据包, 然后由 ICMP 协议将这个数据包连同地址“192.168.0.5”一起 交给IP 层协议(和 ICMP 一样,实际上是一组后台运行的进程),IP 层协议将以地址 “192.168.0.5”作为目的地址,本机 IP 地址作为源地址,加上一些其他的控制信息,构建一 个 IP 数据包,并想办法得到 192.168.0.5 的MAC 地址(物理地址,这是数据链路层协议构 建数据链路层的传输单元——帧所必需的),以便交给数据链路层构建一个数据帧。关键就 在这里,IP 层协议通过机器 B 的 IP 地址和自己的子网掩码,发现它跟自己属同一网络,就 直接在本网络内查找这台机器的 MAC,如果以前两机有过通信,在 A 机的 ARP 缓存表应该 有 B 机 IP 与其 MAC 的映射关系,如果没有,就发一个 ARP 请求广播,得到 B 机的 MAC, 一并交给数据链路层。后者构建一个数据帧,目的地址是 IP 层传过来的物理地址,源地址 则是本机的物理地址,还要附加上一些控制信息,依据以太网的介质访问规则,将它们传送 出去。 主机 B 收到这个数据帧后,先检查它的目的地址,并和本机的物理地址对比,如符合, 则接收;否则丢弃。接收后检查该数据帧,将 IP 数据包从帧中提取出来,交给本机的 IP 层 协议。同样,IP 层检查后,将有用的信息提取后交给 ICMP 协议,后者处理后,马上构建 一个 ICMP 应答包,发送给主机 A,其过程和主机 A 发送 ICMP 请求包到主机 B 一模一样。

2.不在同一网段内

在主机 A 上运行“Ping 192.168.1.4”后,开始跟上面一样,到了怎样得到 MAC 地址时,IP 协议通过计算发现 D 机与自己不在同一网段内,就直接将交由路由处理,也就是将路由的 MAC 取过来,至于怎样得到路由的 MAC,跟上面一样,先在 ARP 缓存表找,找不到就广 播吧。路由得到这个数据帧后,再跟主机 D 进行联系,如果找不到,就向主机 A 返回一个 超时的信息。

补充ARP和ICMP知识点

ICMP属于网络层协议。

在OSI模型中ARP协议属于链路层;而在TCP/IP模型中,ARP协议属于网络层。 

ARP分层的位置是TCP/IP的网络层
    ARP报文是由以太网帧进行封装传输的。没有封装进IP包。
    实际上,对网络接口层的以太网帧来讲,它们同样是帧的上层协议,当收到以太帧时,根据帧的协议字段判断是送到ARP还是IP。
    之所以不把它放在数据链路层,是因为它并不具备数据链路层的功能,它的作用是为数据链路层提供接收方的帧地地址。 ARP和RARP画在IP层稍下端,而ICMP和IGMP画在IP层的上部,因为这二个协议是由IP进行封装的。


下面是ARP报文格式和ICMP报文格式:

十六、正向代理和反向代理

http://www.cnblogs.com/Anker/p/6056540.html

十七、分析一台主机不能上网的原因

TCP/IP协议问题:通过“ping 127.0.0.1”来判断TCP/IP是否安装成功
    网卡驱动问题:输入”ipconfig”获得本机IP地址,通过”Ping 本地IP地址”来判断网卡或网卡驱动是否有问题
    网线连接问题:输入”ipconfig”获得网关地址,通过”Ping 网关IP地址”,如果不通则说明问题基本出现在网线上
    网络防火墙设置不当:安全等级过高,不小心把IE放进阻止访问列表
    DNS服务器问题:当IE无法浏览网页时,可以尝试用IP地址来访问,如果可以访问,那应该是DNS的问题,造成DNS的问题可能是连网时获取DNS出错或DNS服务器本身问题,这时可以手动指定DNS服务(地址可以是你当地LSP提供的DNS服务器地址,也可以用其他地方可正常使用DNS服务)
    电脑中毒
十八、粘包问题以及解决方案

粘包出现的原因:

1.发送端等缓冲区满之后才发送数据

2.接受方未能及时接受缓冲区的包,造成粘包

解决方案:

1.发送固定长度的包,对方接受时以定长形式,就能确定边界

2.使用特殊标记作为消息之间的间隔,比如\r\n

3.包头上加上包体长度,包头是定长的,比如4字节,接收时,可以先接收包头这4个字节,从而计算出包体长度,然后接收包体数据包。

十九、IP地址的分类

A类地址

A类IP地址是首位以0开头的地址。从第1位到第8位是它的网络标识。用十进制表示的话,0.0.0.0~127.0.0.0是A类的网络地址。A类地址的后24位相当于主机标识,因此,一个网段内可容纳的主机地址上限为16 777 214个。

B类地址

B类IP地址是前两位为10的地址,从第1位到16位是它的网络标识。用十进制表示的话,128.0.0.1~191.255.0.0是B类的网络地址。B类地址的后16位相当于主机标识,因此,一个网段可容纳的主机上限为65 534个。

C类地址

C类IP地址是前三位为110的地址,从第1位到24位是它的网络标识。用十进制表示的话,192.168.0.0~239.255.255.0是C类的网络地址。C类地址的后8位相当于主机标识,因此,一个网段可容纳的主机上限为254个。

D类地址

D类IP地址是前四位为1110的地址,从第1位到32位是它的网络标识。用十进制表示的话,224.0.0.0~239.255.255.255是D类的网络地址。D类地址没有主机标识,常被用于多播。

注意:

主机地址不能全部为0或1,全部0表示对应的网络地址或IP地址不可获知,全部为1的主机地址通常作为广播地址,因此所容纳的主机数量应该减2。

二十、TCP soctet交互流程?

服务器:

创建socket -> int socket(int domain, int type, int protocol);


domain:协议域,决定了socket的地址类型,IPv4为AF_INET。

type:指定socket类型,SOCK_STREAM为TCP连接。

protocol:指定协议。IPPROTO_TCP表示TCP协议,为0时自动选择type默认协议。


绑定socket和端口号 -> int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

    // IPv4的sockaddr地址结构    struct sockaddr_in {        sa_family_t sin_family;    // 协议类型,AF_INET        in_port_t sin_port;    // 端口号        struct in_addr sin_addr;    // IP地址    };    struct in_addr {        uint32_t s_addr;    }


sockfd:socket返回的套接字描述符,类似于文件描述符fd。

addr:有个sockaddr类型数据的指针,指向的是被绑定结构变量。

addrlen:地址长度。

监听端口号 -> int listen(int sockfd, int backlog);

sockfd:要监听的sock描述字。

backlog:socket可以排队的最大连接数。


接收用户请求 -> int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);


sockfd:服务器socket描述字。

addr:指向地址结构指针。

addrlen:协议地址长度。

注:一旦accept某个客户机请求成功将返回一个全新的描述符用于标识具体客户的TCP连接。


从socket中读取字符 -> ssize_t read(int fd, void *buf, size_t count);


fd:连接描述字。

buf:缓冲区buf。

count:缓冲区长度。

注:大于0表示读取的字节数,返回0表示文件读取结束,小于0表示发生错误。


关闭socket -> int close(int fd);


fd:accept返回的连接描述字,每个连接有一个,生命周期为连接周期。

注:sockfd是监听描述字,一个服务器只有一个,用于监听是否有连接;fd是连接描述字,用于每个连接的操作。


客户机:

创建socket -> int socket(int domain, int type, int protocol);

连接指定计算机 -> int connect(int sockfd, struct sockaddr* addr, socklen_t addrlen);


sockfd客户端的sock描述字。

addr:服务器的地址。

addrlen:socket地址长度。


向socket写入信息 -> ssize_t write(int fd, const void *buf, size_t count);


fd、buf、count:同read中意义。

大于0表示写了部分或全部数据,小于0表示出错。


关闭oscket -> int close(int fd);


fd:同服务器端fd。


二十一、 解释RTO,RTT和超时重传?

超时重传:发送端发送报文后若长时间未收到确认的报文则需要重发该报文。可能有以下几种情况:

发送的数据没能到达接收端,所以对方没有响应。
    接收端接收到数据,但是ACK报文在返回过程中丢失。
    接收端拒绝或丢弃数据。
RTO:从上一次发送数据,因为长期没有收到ACK响应,到下一次重发之间的时间。就是重传间隔。

通常每次重传RTO是前一次重传间隔的两倍,计量单位通常是RTT。例:1RTT,2RTT,4RTT,8RTT......

重传次数到达上限之后停止重传。

RTT:数据从发送到接收到对方响应之间的时间间隔,即数据报在网络中一个往返用时。大小不稳定。

二十一、socket的发送和接收缓冲区

对于每一个TCP的SOCKET来说,都有一个发送缓冲区和接受缓冲区与之对应。

1.TCP的滑动窗口大小实际上就是socket的接收缓冲区(SO_RCVBUF)大小的字节数

2.对于server端的socket一定要在listen之前设置缓冲区大小,因为,accept时新产生的socket会继承监听socket的缓冲区大 小。对于client端的socket一定要在connet之前设置缓冲区大小,因为connet时需要进行三次握手过程,会通知对方自己的窗口大小。在 connet之后再设置缓冲区,已经没有什么意义。

接收端冲区

接收缓冲区把数据缓存入内核,应用进程一直没有调用recv()进行读取的话,此数据会一直缓存在相应socket的接收缓冲区内。不管进程是否调用recv()读取socket,对端发来的数据都会经由内核接收并且缓存到socket的内核接收缓冲区之中。

recv(),就是把内核缓冲区中的数据拷贝到应用层用户的buffer里面,并返回;

发送缓冲区

进程调用send()发送的数据的时候,最简单情况(也是一般情况),将数据拷贝进入socket的内核发送缓冲区之中,然后send便会在上层返回。换句话说,send()返回之时,数据不一定会发送到对端去(和write写文件有点类似)。

send(),仅仅是把应用层buffer的数据拷贝进socket的内核发送buffer中,发送是TCP的事情,和send其实没有太大关系。
 
--------------------- 
作者:哆啦尼可夫 
来源:CSDN 
原文:https://blog.csdn.net/wk_bjut_edu_cn/article/details/81771635 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/lijiawnen/article/details/88105177