目录
二十六、同一个IP同一个端口可以同时建立tcp和udp的连接吗
三十六、TCP协议,两台主机正在传输数据,突然把网线给拔了,会发生什么?
四十三、传递到IP层怎么知道报文该给哪个应用程序,它怎么区分UDP报文还是TCP报文
四十六、当接受方的接受窗口为0时还能接受数据吗?为什么?还能接受什么数据?那怎么处理这些数据呢?
一、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协议:
- DNS
- TFTP
- RIP
- DHCP
二、OSI七层网络模型
物理层:在物理层上所传数据的单位是比特。物理层的任务就是透明地传送比特流。
数据链路层:互联设备之间传送和识别数据帧。我们知道,两个主机之间的数据传输,总是在一段一段的链路上传送的,也就是说,在两个相邻结点之间传送数据是直接传送的(点对点),这时就需要使用专门的链路层的协议。
网络层:为数据包选择路由。
传输层:起着可靠传输的作用。只在通信双方节点上进行处理,而无需在路由器上处理。
会话层:负责建立和断开通信连接,以及数据的分割等数据传输相关的管理。
表示层:将应用处理的信息转换为适合网络传输的格式,或将来自下一层的数据转换为上层能够处理的格式。因此它主要负责数据格式的转换。
应用层:为应用程序提供服务并规定应用程序中通信相关的细节。包括文件传输、电子邮件、远程登陆等协议。
数据从A 的应用层往下走到物理层,会在每一层都会加上头部信息,进行封装,然后再发送到B。
然后 Server B 从 最下面的物理层往上 每一层进行解封装,最后到达应用层,得到数据。
物理层 | IEE802.3(以太网),CLOCK RJ45 |
数据链路层 | MAC,PPP(点对点协议),SDLC(同步数据链路控制) |
网络层 | IP,RIP,ARP,ICMP |
传输层 | TCP,UDP |
会话层 | RPC,NFS |
表示层 | JPEG(关于图像),ASII |
应用层 | HTTP,HTTPS,FTP,DNS |
传输层协议DCCP是数据报拥塞控制协议是取代UDP的新传输协议,用来传输实时业务。它是一个可以进行拥塞控制的非可靠传输协议,并同时提供多种拥塞控制机制,在通信开始时由用户进行协商选择。
三、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文件(/etc/hosts)是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。
- 如果本地hosts文件不存在映射关系,则会查询本地DNS缓存(windows查看DNS的方式:ipconfig/displaydns),如果存在,则域名解析完成。
- 如果本地hosts文件和DNS缓冲和没有相应的网址映射关系,首先会找tcp/ip参数中设置的本地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服务器,由上一级DNS服务器进行解析,上一级DNS服务器如果不能解析,或找根DNS或把请求转至上上级,以此循环。
- 经过三次握手,建立TCP连接。
- 发送HTTP请求,具体包括:发送请求行、发送请求头。
- web服务器应答,包括应答行、应答头、所请求的数据。
- 浏览器解析渲染页面,浏览器拿到了服务端返回的HTML页面代码,在解析和渲染这个页面的时候,里面的JS、CSS、图片等静态资源,也是一个个HTTP请求,都需要经过上面的个步骤。
- 连接结束。
打开浏览器,在地址栏输入URL,回车,出现网页内容。整个过程发生了什么?其中的原理是什么?以下进行整理和总结。
整个过程可以概括为几下几个部分:(这4个过程都应该进行详细说明)
- 域名解析成IP地址;
- 与目的主机进行TCP连接(三次握手);
- 发送与收取数据(浏览器与目的主机开始HTTP访问过程);
- 浏览器解析渲染页面
- 与目的主机断开TCP连接(四次挥手);
域名解析成IP地址对应的过程就是DNS工作的过程。
ARP
ARP在在OSI模型中ARP协议属于链路层;而在TCP/IP模型中,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使用端口号提供进程到进程间的通信。下面是一些熟知端口号。
端口 | 协议 | 说明 |
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协议头中有seq和ack_seq两个字段,分别代表序列号和确认号。tcp协议通过序列号标识发送的报文段。seq的类型是__u32,当超过__u32的最大值时,会回绕到0。
一个tcp流的初始序列号(ISN)并不是从0开始的,而是采用一定的随机算法产生的,因此ISN可能很大(比如(2^32-10)),因此同一个tcp流的seq号可能会回绕到0。而我们tcp对于丢包和乱序等问题的判断都是依赖于序列号大小比较的。此时就出现了所谓的tcp序列号回绕(sequence wraparound)问题。
下面是内核的解决办法
原理
(__s32)(seq1-seq2)<0就可以判断seq1<seq2呢?这里的__s32是有符号整型的意思,而__u32则是无符号整型。为了方便说明,我们以unsigned char和char为例来说明:假设seq1=255, seq2=1(发生了回绕)。
seq1 = 1111 1111 seq2 = 0000 0001
我们希望比较结果是seq1<seq2
seq1 - seq2=
1111 1111
-0000 0001
-----------
1111 1110
因此seq1 - seq2 < 0
为什么TCP客户端最后还要发送一次确认呢?
一句话,主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。
如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。
如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。
TCP三次握手的第三个ack丢了会怎样?
当Client端收到Server的SYN+ACK应答后,其状态变为ESTABLISHED,并发送ACK包给Server;
如果此时ACK在网络中丢失,那么Server端该TCP连接的状态为SYN_RECV,并且依次等待3秒、6秒、12秒后重新发送SYN+ACK包,以便Client重新发送ACK包,以便Client重新发送ACK包。
Server重发SYN+ACK包的次数,可以通过设置/proc/sys/net/ipv4/tcp_synack_retries修改,默认值为5。
如果重发指定次数后,仍然未收到ACK应答,那么一段时间后,Server自动关闭这个连接。
但是Client认为这个连接已经建立,如果Client端向Server写数据,Server端将以RST包响应,方能感知到Server的错误。
三次握手过程中做了哪些准备工作?
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一般都会分开发送,从而导致多了一次。
服务端产生大量CLOSE_WAIT状态的原因与解决方法
什么情况下,连接处于CLOSE_WAIT状态呢?
在被动关闭连接情况下,在已经接收到FIN,但是还没有发送自己的FIN的时刻,连接处于CLOSE_WAIT状态。通常来讲,CLOSE_WAIT状态的持续时间应该很短,正如SYN_RCVD状态。但是在一些特殊情况下,就会出现连接长时间处于CLOSE_WAIT状态的情况。
产生原因
出现大量close_wait的现象,主要原因是某种情况下对方关闭了socket链接,但是我方忙于读或者写,没有关闭连接。代码需要判断socket,一旦读到0,断开连接,read返回负,检查一下errno,如果不是AGAIN,就断开连接。
危害
CLOSE_WAIT 过多导致服务器资源占用,客户端在 FIN_WAIT_2 状态超时大约 60s,自动进入 CLOSED状态, 影响不大。但是服务端在 CLOSE_WAIT 的超时时间默认为 43200秒,所以大量的 CLOSE_WAIT 积压可能造成服务器无法分配出资源给新的连接。一般这种情况都是由于服务器没有调用 close 造成的。程序员应该主动检查代码。
解决办法
1.代码需要判断socket,一旦read返回0,断开连接,read返回负,检查一下errno,如果不是AGAIN,也断开连接。
2.给每一个socket设置一个时间戳last_update,每接收或者是发送成功数据,就用当前时间更新这个时间戳。定期检查所有的时间戳,如果时间戳与当前时间差值超过一定的阈值,就关闭这个socket。
3.设置SO_KEEPALIVE选项(周期性测试连接是否存活)。
为什么客户端最后还要等待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首部中,专门有一个字段用来通知窗口大小。接收主机将自己可以接收的缓冲区大小放入这个字段中通知给发送端。这个字段的值越大,说明网络的吞吐量越高。
UDP如何实现可靠传输
由于在传输层UDP已经是不可靠的连接,那就要在应用层自己实现一些保障可靠传输的机制
简单来讲,要使用UDP来构建可靠的面向连接的数据传输,就要实现类似于TCP协议的
- 超时重传(定时器)
- 有序接受 (添加包序号)
- 应答确认 (Seq/Ack应答机制)
- 滑动窗口流量控制等机制 (滑动窗口协议)
等于说要在传输层的上一层(或者直接在应用层)实现TCP协议的可靠数据传输机制,比如使用UDP数据包+序列号,UDP数据包+时间戳等方法。
九、计算机网络中的网关和网桥
什么是网关?
网关是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层交换机(第二层)
网桥能够起到的作用是把多个局域网连接起来,组成更大的局域网,它的功能有两点,过滤和转发。
注意:用转发器或桥接器(网桥等)连接起来的若干个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工作在应用层,它直接使用网络层的ICMP协议,而没有使用传输层的TCP/UDP协议。
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。
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其实没有太大关系。
二十二、糊涂窗口综合症
什么是糊涂窗口综合症
当发送端应用进程产生数据很慢、或接收端应用进程处理接收缓冲区数据很慢,或二者兼而有之;就会使应用进程间传送的报文段很小,特别是有效载荷很小。 极端情况下,有效载荷可能只有1个字节;而传输开销有40字节(20字节的IP头+20字节的TCP头) 这种现象就叫糊涂窗口综合症
发送端引起的糊涂窗口综合症
如果发送端为产生数据很慢的应用程序服务(典型的有telnet应用),例如,一次产生一个字节。这个应用程序一次将一个字节的数据写入发送端的TCP的缓存。如果发送端的TCP没有特定的指令,它就产生只包括一个字节数据的报文段。结果有很多41字节的IP数据报就在互连网中传来传去。
解决的方法是防止发送端的TCP逐个字节地发送数据。必须强迫发送端的TCP收集数据,然后用一个更大的数据块来发送。发送端的TCP要等待多长时间呢?如果它等待过长,它就会使整个的过程产生较长的时延。如果它的等待时间不够长,它就可能发送较小的报文段。Nagle找到了一个很好的解决方法,发明了Nagle算法。
接收端引起的糊涂窗口综合症
接收端的TCP可能产生糊涂窗口综合症,如果它为消耗数据很慢的应用程序服务,例如,一次消耗一个字节。假定发送应用程序产生了1000字节的数据块,但接收应用程序每次只吸收1字节的数据。再假定接收端的TCP的输入缓存为4000字节。发送端先发送第一个4000字节的数据。接收端将它存储在其缓存中。现在缓存满了。它通知窗口大小为零,这表示发送端必须停止发送数据。接收应用程序从接收端的TCP的输入缓存中读取第一个字节的数据。在入缓存中现在有了1字节的空间。接收端的TCP宣布其窗口大小为1字节,这表示正渴望等待发送数据的发送端的TCP会把这个宣布当作一个好消息,并发送只包括一个字节数据的报文段。这样的过程一直继续下去。一个字节的数据被消耗掉,然后发送只包含一个字节数据的报文段。
解决办法是延迟确认,延迟一段时间后再发送确认。这表示当一个报文段到达时并不立即发送确认。接收端在确认收到的报文段之前一直等待,直到入缓存有足够的空间为止。延迟的确认防止了发送端的TCP滑动其窗口。当发送端的TCP发送完其数据后,它就停下来了。这样就防止了这种症状。
迟延的确认还有另一个优点:它减少了通信量。接收端不需要确认每一个报文段。但它也有一个缺点,就是迟延的确认有可能迫使发送端重传其未被确认的报文段。
可以用协议来平衡这个优点和缺点,例如现在定义了确认的延迟不能超过500毫秒。
二十三、别人知识点的一些汇总
https://blog.csdn.net/u012414189/article/details/83830926
二十四、TCP中的四个计时器
TCP中的四个计时器包括重传计时器、坚持计时器、保活计时器、时间等待计时器。
重传计时器(Retransmission Timer):
- 目的:为了控制丢失的报文段或者丢弃的报文段。这段时间为对报文段的等待确认时间。
- 创建时间:在TCP发送报文段时,会创建对次特定报文段的重传计时器。
- 可能发生的两种情况:在截止时间(通常为60秒)到之前,已经收到了对此特定报文段的确认,则撤销计时器;在截止时间到了,但为收到对此特定报文段的确认,则重传报文段,并且将计时器复位。
- 重传时间:2*RTT(Round Trip Time,为往返时间)
坚持计时器(Persistent Timer):
- 目的:主要解决零窗口大小通知可能导致的死锁问题
- 死锁问题的产生:当接收端的窗口大小为0时,接收端向发送端发送一个零窗口报文段,发送端即停止向对端发送数据。此后,如果接收端缓存区有空间则会重新给发送端发送一个窗口大小,即窗口更新。但接收端发送的这个确认报文段有可能会丢失,而此时接收端不知道已经丢失并认为自己已经发送成功,则一直处于等待数据的状态;而发送端由于没有收到该确认报文段,就会一直等待对方发来新的窗口大小,这样一来,双方都处在等待对方的状态,这样就形成了一种死锁问题。如果没有应对措施,这种局面是不会被打破的。为了解决这种问题,TCP为每一个连接设置了坚持计时器。
- 工作原理:当发送端TCP收到接收端发来的零窗口通知时,就会启动坚持计时器。当计时器的期限到达时,发送端就会主动发送一个特殊的报文段告诉对方确认已经丢失,必须重新发送。【这个特殊的报文段就称为探测报文段,探测报文段只有1个字节的大小,里边只有一个序号,该序号不需要被确认,甚至在计算其他部分数据的确认时该序号会被忽略。】
- 截止期的设置:设置为重传时间的值。但如果没有收到接收端的响应,则会发送另一个探测报文段,并将计时器的值加倍并复位,直到大于门限值(一般为60秒)。在此之后,发送端会每隔60秒发送一个探测报文段,直到窗口重新打开。
保活计时器(Keeplive Timer):
- 目的:主要是为了防止两个TCP连接出现长时间的空闲。当客户端与服务器端建立TCP连接后,很长时间内客户端都没有向服务器端发送数据,此时很有可能是客户端出现故障,而服务器端会一直处于等待状态。保活计时器就是解决这种问题而生的。
- 工作原理:每当服务器端收到客户端的数据时,都将保活计时器重新设置(通常设置为2小时)。过了2小时后,服务器端如果没有收到客户端的数据,会发送探测报文段给客户端,并且每隔75秒发送一个,当连续发送10次以后,仍没有收到对端的来信,则服务器端认为客户端出现故障,并会终止连接。
时间等待计时器(Time_Wait Timer):
- 时间等待计时器是在连接终止期间使用的。
- 当TCP关闭连接时并不是立即关闭的,在等待期间,连接还处于过渡状态。这样就可以使重复的FIN报文段在到达终点之后被丢弃。
- 时间设置:一般为报文段寿命期望值的2倍。
二十四、TCP检验和
检验和目的
目的是为了发现TCP首部和数据在发送端到接收端之间发生的任何改动。如果接收方检测到检验和有差错,则TCP段会被直接丢弃。
TCP在计算检验和时,要加上一个12字节的伪首部。
伪首部
伪首部共有12字节,包含IP首部的一些字段,有如下信息:32位源IP地址、32位目的IP地址、8位保留字节(置0)、8位传输层协议号(TCP是6,UDP是17)、16位TCP报文长度(TCP首部+数据)。
伪首部是为了增加TCP校验和的检错能力:通过伪首部的目的IP地址来检查TCP报文是否收错了、通过伪首部的传输层协议号来检查传输层协议是否选对了。
检验和计算过程
TCP首部校验和计算三部分:TCP首部+TCP数据+TCP伪首部。
发送端:
首先,把伪首部、TCP报头、TCP数据分为16位的字,如果总长度为奇数个字节,则在最后增添一个位都为0的字节。
把TCP报头中的校验和字段置为0。
其次,用反码相加法(对每16bit进行二进制反码求和)累加所有的16位字(如果最高位产生进位,加到最低位)。
最后,将上述结果作为TCP的校验和,存在检验和字段中。
接收端:
将所有原码的反码相加,如果最高位产生进位,加到最低位, 如计算结果的16位中每一位都为1,则正确,否则说明发生错误。
举例
以4bit 为例
发送端计算:
数据: 1000 0100 校验和 0000
则反码:0111 1011 1111
叠加: 0111+1011+1111=0011+1111=0011(如果最高位产生进位,加到最低位)
0011即为校验和
接收端计算:
数据: 1000 0100 检验和 0011
反码: 0111 1011 1100
叠加: 0111 + 1011 +1100 = 0011+1100=1111
全为1,则正确
二十五、SSH协议
简单说,SSH 是一种网络协议,用于计算机之间的加密登录。
中间人攻击
SSH 之所以能够保证安全,原因在于它采用了公钥加密。
整个过程是这样的:
- 远程主机收到用户的登录请求,把自己的公钥发给用户。
- 用户使用这个公钥,将登录密码加密后,发送回来。
- 远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。
这个过程本身是安全的,但是实施的时候存在一个风险:如果有人截获了登录请求,然后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪。因为不像 https 协议,SSH 协议的公钥是没有证书中心(CA)公证的,也就是说,都是自己签发的。
可以设想,如果攻击者插在用户与远程主机之间(比如在公共的 wifi 区域),用伪造的公钥,获取用户的登录密码。再用这个密码登录远程主机,那么 SSH 的安全机制就荡然无存了。这种风险就是著名的"中间人攻击"(Man-in-the-middle attack)。
SSH 协议是如何应对的呢?
如果你是第一次登录对方主机,系统会出现下面的提示:
$ ssh user@host
The authenticity of host 'host (12.18.429.21)' can't be established.
RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.
Are you sure you want to continue connecting (yes/no)?
这段话的意思是,无法确认 host 主机的真实性,只知道它的公钥指纹,问你还想继续连接吗?
所谓 "公钥指纹",是指公钥长度较长(这里采用 RSA 算法,长达 1024 位),很难比对,所以对其进行 MD5 计算,将它变成一个 128 位的指纹。上例中是 98:2e:d7:e0:de :9f:ac:67:28:c2:42:2d:37:16:58:4d,再进行比较,就容易多了。
很自然的一个问题就是,用户怎么知道远程主机的公钥指纹应该是多少?回答是没有好办法,远程主机必须在自己的网站上贴出公钥指纹,以便用户自行核对。
假定经过风险衡量以后,用户决定接受这个远程主机的公钥。
公钥登录(免密登录)
使用密码登录,每次都必须输入密码,非常麻烦。好在 SSH 还提供了公钥登录,可以省去输入密码的步骤。
所谓 "公钥登录",原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发送过去。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录 shell,不再要求密码。
二十六、同一个IP同一个端口可以同时建立tcp和udp的连接吗
答可以,同一个端口虽然udp和tcp的端口数字是一样的,但实质他们是不同的端口,所以是没有影响的,从底层实质分析,对于每一个连接内核维护了一个五元组,包含了源ip,目的ip、源端口目的端口、以及传输协议,在这里尽管前4项都一样,但是传输协议是不一样的,所以内核会认为是2个不同的连接,在ip层就会进行开始分流,tcp的走tcp,udp走udp。
二十七、一个ip地址最多可以同时对外发起多少tcp连接
系统用一个4四元组来唯一标识一个TCP连接:{local ip, local port,remote ip,remote port}。
我们知道在网络通信过程中服务端监听一个固定的端口,客户端主动发起连接请求后要经过三次握手才能与服务器建立起一个tcp连接.客户端每次发起一个tcp连接时,系统会随机选取一个空闲的端口,该端口是独占的不能与其他tcp连接共享,因此理论上一台机器有多少空闲的端口,就能对外发起多少个tcp连接,根据tcp/ip协议,端口port使用16位无符号整数unsigned short来存储,因此本地端口一共有2^16=65536个,即0-65535,其中0~1023是预留端口,0有特殊含义不能使用,1024以下端口都是超级管理员用户(如root)才可以使用,因此就算使用root权限,一台机器最多能使用的端口也只有65535个(除去一些保留的和已被占用的端口,实际可能不足这个数)。
因为受服务器资源、操作系统的限制,linux内核默认文件描述符最大值是1024,也就是说默认支持最大并发连接是1024个(每个tcp连接都要占用一定内存,每个socket就是一个文件描述符)
我们输入以下命令查看linux内核参数:
在/etc/security/limits.conf文件中配置如下两行:
- hard nofile 102400
- soft nofile 102400
soft和hard为两种限制方式,其中soft表示警告的限制,hard表示真正限制,nofile表示打开的最大文件数。
前面研究的是client能建立的最大tcp连接数,而server能接收的最大tcp连接数又是多少呢?
理论上是无上限的,server通常固定在某个本地端口上监听client的连接请求.不考虑地址重用(unix的SO_REUSEADDR选项)的情况下,即使server端有多个ip,本地监听端口也是独占的,因此server端tcp连接4元组中只有remote ip(也就是client ip)和remote port(客户端port)是可变的,因此最大tcp连接为客户端ip数×客户端port数,对于IPV4,不考虑ip地址分类等因素,最大tcp连接数约为2的32次方(ip数)×2的16次方(port数),也就是server端单个ip单个端口最大tcp连接数约为2的48次方。
但是在实际环境中,受到服务器配置等物理条件的制约,其最大并发tcp连接数远不能达到理论值,不过通过增加内存、修改最大文件描述符个数等参数,单机最大并发TCP连接数是可以达到10万,甚至上百万的。
二十八、MSS和MTU
MTU:maximum transmission unit,最大传输单元,由硬件规定,如以太网的MTU为1500字节。
MSS: MSS最大传输大小的缩写,是TCP协议里面的一个概念。最大分节大小,为TCP数据包每次传输的最大数据分段大小,一般由发送端向对端TCP通知对端在每个分节中能发送的最大TCP数据。MSS值为MTU值减去IPv4 Header(20 Byte)和TCP header(20 Byte)得到。
MSS就是TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能,TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包20Bytes)所以往往MSS为1460。通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。
注:最大报文段长度MSS这个名词很容易引起误解。MSS是TCP报文段中的数据字段的最大长度。数据字段加上TCP首部才等于整个的TCP报文段。所以MSS并不是TCP报文段的最大长度,而是:MSS=TCP报文段长度-TCP首部长度
分片:若一IP数据报大小超过相应链路的MTU的时候,IPV4和IPV6都执行分片(fragmentation),各片段到达目的地前通常不会被重组(re-assembling)。IPV4主机对其产生的数据报执行分片,IPV4路由器对其转发的数据也执行分片。然而IPV6只在数据产生的主机执行分片;IPV6路由器对其转发的数据不执行分片。
二十九、子网掩码
一个IP地址只要确定了其分类,也就确定了它的网络标识和主机标识。网络标识相同的计算机必须同属同一个链路。
例如,架构B类IP网络时,理论上一个链路内允许6万5千多台计算机连接。然而,在实际网络架构当中,一般不会有在同一个链路上连接6万5千多台计算机的情况。因此,这种网络结构实际上市不存在的。因此,直接使用A类或B类地址,确实有些浪费。随着互联网的覆盖范围逐渐增大,网络地址会越来越不足以应对需求,直接使用A类、B类、C类地址就更显的浪费资源。为此,人们已经开始一种新的组合方式以减少这种浪费。
现在,一个IP地址的网络标识和主机标识已不再受限于该地址的类别,而是一个叫做“子网掩码”的识别码通过子网网络地址细分出比A、B、C更小粒度的网络。这种方式实际上就是将原来A、B、C类等分类中的主机地址部分用作子网地址,可以将原网络分为多个物理网络的一种机制。子网划分实际上就是将原来的两级IP地址转变为三级IP地址,表示如下:
IP地址 ::= {<网络号>, <子网号>, <主机号>}
从上面的表示可以看出,子网划分就是在32位中借了几位用来表示子网号,注意,这里的网络号的位数是不变的,子网号是从主机号中借走的,子网划分实际上就是减少了主机数,分配到不同的子网,每个子网包含一定的主机数。
子网的概念也就可以理解为,将一个大的网络在其内部划分成几个小的子网,但是需要注意的是,对于该网络的外层来看,还是一个大的网络,只有该网络内部才可以看到其进行了子网划分。例如:某个机构给某高校分配了一个大的网络,而该高校内部又进行了子网划分,将不同的子网分配给不同的学院,此时对于该机构来说,该高校还是一个大的网络,在其看来并没有变化,只有该高校自己才知道自己内部又进行了子网划分。
主流的子网掩码的表示方法是在每个IP地址后面追加网络地址的位数用“/”隔开。
要判断两个IP地址是不是在同一个网段,就将它们的IP地址分别与子网掩码做与运算,得到的结果一网络号,如果网络号相同,就在同一子网,否则,不在同一子网。
如何通过子网掩码计算求主机地址:
设IP地址为192.168.10.2,子网掩码为255.255.255.240。主机地址为:0.0.0.2(将掩码取反,然后与运算)。
三十、路由控制
路由器作用
路由器是在OSI模型的第3层--网络层面上连接两个网络、并对分组报文进行转发的设备。网桥是根据物理地址进行处理,而路由器/3层交换机则是根据IP地址进行处理。路由器可以连接不同的数据链路。比如两个以太网、一个以太网与一个FDDI。
提供了路由与转发两种重要机制。路由决定数据包从来源端到目的端所经过的路由路径;转发:路由器数据层面的工作,将路由器输入端的数据包移送至适当的路由器输出端(在路由器内部进行)。
RIP路由协议
发送数据包时所使用的地址是网络层的地址,即 IP 地址。然而仅仅有 IP 地址还不足以实现将数据包发送到对端目标地址,在数据发送过程中还需要类似于“指明路由器或主机”的信息,以便真正发往目标地址。保存这种信息的就是路由控制表。
该路由控制表的形成方式有两种:一种是管理员手动设置,另一种是路由器与其他路由器相互交换信息时自动刷新。前者也叫做静态路由控制,而后者叫做动态路由控制。
路由控制表中记录着网络地址与下一步应该发送至路由器的地址。在发送 IP 包时,首先要确定 IP 包首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将 IP 包转发给相应的下一个路由器。如果路由控制表中存在多条相同网络地址的记录,就选择一个最为吻合的网络地址。
基本原理
- 仅和相邻路由器交换信息。
- 路由器交换的信息是当前本路由器所知道的全部信息。
- 按固定的时间交换路由信息。
RIP路由更新算法
RIP协议有两种更新机制:一是定期更新,二是触发更新。“定期更新”是根据设置的更新计时器定期发送RIP路由通告。该通告报文中携带了除“水平分割”机制抑制的RIP路由之外本地路由器中的所有RIP路由信息。而“触发更新”则是RIP路由器仅在有路由表项发生变化时发送的RIP路由通告,仅携带本地路由表中有变化的路由信息。RIP路由器一旦察觉到网络变化,就尽快甚至是立即发送更新报文,而不等待更新周期结束。只要触发更新的速度足够快,就可以大大地防止“计数到无穷大”的发生,但是这一现象还是有可能发生的。
无论是定期更新,还是触发更新,RIP路由的更新规则如下:
- 如果更新的某路由表项在路由表中没有,则直接在路由表中添加该路由表项;
- 如果路由表中已有相同目的网络的路由表项,且来源端口相同,那么无条件根据最新的路由信息更新其路由表;
- 如果路由表中已有相同目的网络的路由表项,但来源端口不同,则要比较它们的度量值,将度量值较小的一个作为自己的路由表项;
- 如果路由表中已有相同目的网络的路由表项,且度量值相等,保留原来的路由表项。
路由环路的产生
当A路由器一侧的X网络发生故障,则A路由器收到故障信息,并把X网络设置为不可达,等待更新周期来通知相邻的B路由器。但是,如果相邻的B路由器的更新周期先来了,则A路由器将从B路由器那学习了到达X网络的路由,就是错误路由,因为此时的X网络已经损坏,而A路由器却在自己的路由表内增加了一条经过B路由器到达X网络的路由。然后A路由器还会继续把该错误路由通告给B路由器,B路由器更新路由表,认为到达X网络须经过A路由,然后继续通知相邻的路由器,至此路由环路形成,A路由器认为到达X网络经过B路由器,而B则认为到达X网络进过A路由器。
解决办法
(1)触发更新
如果网络中没有变化,则定时(30s)发送所有路由信息。
如果网络中有变化,立即发送更新后的所有路由信息;而且为了避免触发广播风暴,随机延时后再通告。
(2)水平分割
从哪个接口来的信息不会再从那个接口发布出去。
三十一、TCP控制位RST
该位为1时表示TCP连接中出现异常必须强制断开连接。一般来说,有以下三种情况:
1. 访问不存在的端口。若端口不存,则直接返回RST,同时RST报文接收通告窗口大小为0。其实客户端向服务器的某个端口发起连接,如果端口被处于TIME_WAIT 状态的连接占用时,客户端也会收到RST。
2. 异常终止连接。一方直接发送RST报文,表示异常终止连接。一旦发送方发送复位报文段,发送端所有排队等待发送的数据都被丢弃。
3.往一个已经发送FIN的套接字中写是允许的,接收到FIN仅仅代表对方不再发送数据并不代表不能发送数据给对方。现在是发数据给对方,但是对方进程已经不存在了,就会导致TCP的重置,对方会发送RST的TCP给我们。
三十二、TCP层的分段和IP层的分片
UDP 包的大小就应该是 1500 - IP头(20) - UDP头(8) = 1472(Bytes)
TCP 包的大小就应该是 1500 - IP头(20) - TCP头(20) = 1460 (Bytes)
MTU,最大传输单元
以太网和802.3对数据帧的长度都有一个限制,其最大 值分别是1500和1492个字节。链路层的这个特性称作MTU。不同类型的网络大多数都有一个上限。如果IP层有一个数据要传,且数据的长度比链路层的 MTU还大,那么IP层就要进行分片,把数据报分成若干片,这样每一个分片都小于MTU。
MSS最大分段大小的缩写,是TCP协议里面的一个概念
MSS就是TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460。通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。
相信看到这里,还有最后一个问题:TCP是如何实现分段的呢?其实TCP无所谓分段,因为每个TCP数据报在组成前其大小就已经被MSS限制了,所以TCP数据报的长度是不可能大于MSS的,当然由它形成的IP包的长度也就不会大于MTU,自然也就不用IP分片了。
总结:
- IP分片产生的原因是网络层的MTU;TCP分段产生原因是MSS.
- IP分片由网络层完成,也在网络层进行重组;TCP分段是在传输层完成,并在传输层进行重组. //透明性
- 对于以太网,MSS为1460字节,而MUT往往会大于MSS.
故采用TCP协议进行数据传输,是不会造成IP分片的。若数据过大,只会在传输层进行数据分段,到了IP层就不用分片。
所以可以看成是这种情况:传输层协议想发送一个超过了MTI的数据报,这个时候网络层就需要对其进行分片,一般UDP和ICMP会出现分片情况,但是TCP不会出现这种情况!因为TCP使用了MSS来避免分片!
三十三、Nagle算法
TCP/IP协议中针对TCP默认开启了Nagle算法。启动TCP_NODELAY,就意味着禁用了Nagle算法。
在使用一些协议通讯的时候,比如Telnet,会有一个字节字节的发送的情景,每次发送一个字节的有用数据,就会产生41个字节长的分组,20个字节的IP Header 和 20个字节的TCP Header,这就导致了1个字节的有用信息要浪费掉40个字节的头部信息,这是一笔巨大的字节开销。
如果发送端欲多次发送包含少量字符的数据包(一般情况下,后面统一称长度小于MSS的数据包为小包,与此相对,称长度等于MSS的数据包为大包,为了某些对比说明,还有中包,即长度比小包长,但又不足一个MSS的包),则发送端会先将第一个小包发送出去,而将后面到达的少量字符数据都缓存起来而不立即发送,直到收到接收端对前一个数据包报文段的ACK确认、或当前字符属于紧急数据,或者积攒到了一定数量的数据(比如缓存的字符数据已经达到数据包报文段的最大长度)等多种情况才将其组成一个较大的数据包发送出去。
三十四、半连接、半打开、半关闭
1.半连接
定义
发生在TCP3次握手中。如果A向B发起TCP请求,B也按照正常情况进行响应了,但是A不进行第3次握手,这就是半连接。
半连接攻击
半连接,会造成B分配的内存资源就一直这么耗着,直到资源耗尽。
2.半打开(Half-Open)
定义
如果一方已经关闭或异常终止连接,而另一方却不知道。 我们将这样的TCP连接称为半打开(Half-Open)。
3.半关闭
定义
TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力,这就是TCP的半关闭。
当一方关闭发送通道后,仍可接受另一方发送过来的数据,这样的情况叫“半关闭”。(拆除TCP连接是:你关闭你的发送通道,我关闭我的发送通道)。
半关闭的产生
客户端发送FIN,另一端发送对这个FIN的ACK报文段。 此时客户端就处于半关闭。
调用shutdown,shutdown的第二个参数为SHUT_WR时,为半关闭。
三十五、局域网、广域网、城域网
局域网LAN(Local Area Network):一般指覆盖范围在10公里以内,一座楼房或一个单位内部的网络。由于传输距离直接影响传输速度,因此,局域网内的通信,由于传输于距离短,传输的速率一般都比较高。目前,局域网的传输速率一般可达到10MB/S和100MB/S,高速局域网传输速率可达到1000MB/S。广域网WAN(Wide Area Network):是指远距离的、大范围的计算机网络。跨地区、跨城市、跨国家的网络都是广域网。由于广域的覆盖范围广,联网的计算机多,因此广域网上的信息量非常大,共享的信息资源很丰富。INTERNET是全球最大的广域网,它覆盖的范围遍布全世界。城域网MAN(Metropolitan Area Network):其覆盖范围在局域网和广域网之间。一般指覆盖范围为一个城市的网络。
三十六、TCP协议,两台主机正在传输数据,突然把网线给拔了,会发生什么?
原文地址https://blog.csdn.net/stpeace/article/details/44162349
简要说说另外一种网络结构, 假设把pc1和pc2直接用网线相连, 建立起世界最小局域网, 并形成tcp连接。如果在客户端和服务端都没有心跳机制,那么实验结果如下:
- 如果断掉其中的网线, 客户端和服务端都没有感知。
- 客户端突然断电, 则服务端没有感知。
- 服务端突然断电, 则客户端没有感知。
可以通过setsockopt函数中设置SO_KEEPALIVE来监测。
三十七、报文经过路由器路由转发后,以下说法哪个正确?(A)
A.报文的源MAC、目的MAC会改变
B.报文的源IP、目的IP会改变
C.报文不会有任何变化
D.报文的源MAC、目的MAC、源IP、目的IP都会变化
三十八、端口扫描方式
端口扫描
端口扫描是指某些别有用心的人发送一组端口扫描消息,试图以此侵入某台计算机,并了解其提供的计算机网络服务类型(这些网络服务均与端口号相关)。
TCP
1.端口扫描:目标主机的一个端口如果是监听状态(LISTENING或者LINSTEN),那么当我connect目标主机时就能成功,否则说明端口是关闭的。
2.SYN扫描:双方并没有建立起一条完整的连接,而是扫描着先向被扫描的目的端口发出一个SYN包,如果从目标端口返回一个syn/ack包,就可以断定该端口处于监听状态(即端口是开放的),如果返回rst包,则表明端口不在监听状态,是关闭的。
使用syn扫描的优点:速度快,如果不被防火墙过滤的话,基本都能收到应答包,缺点:扫描行为容易被发现,并且它是不可靠的,容易丢包
3. FIN扫描:主动结束的一方发送FIN包,当我们发送一个FIN包给一个非监听的端口时,会有RST应答,反之,发给一个正在监听的端口时,不会有任何回应。
FIN扫描优点:隐蔽性好,速度快,缺点:只能用于Linux系统,Windows系统下无效
UDP
常见的方式有UDP recvfrom扫描,UDP ICMP端口不可达扫描,我采用的是后者,也就是,给一个端口发送UDP报文,如果端口是开放的,则没有响应,如果端口是关闭的,对方会回复一个ICMP端口不可达报文
三十九、常见端口
应用程序 | FTP | SSH | TELNET | SMTP | DNS | TFTP | HTTP | HTTPS |
熟知端口号 | 20/21 | 22 | 23 | 25 | 53 | 69 | 80 | 443 |
25:SMTP服务器所开放的端口,用于发送邮件。
telnet是明文传送, ssh是加密的且支持压缩。
四十、一个ip配置多个域名,靠什么识别?
靠http中的host段来完成,服务器根据host将请求转发到指定的主机上。
四十一、既然mac地址唯一,为什么还要有IP地址?
MAC地址是一个硬件地址,用来定义网络设备的位置,主要由数据链路层负责。而IP地址是IP协议提供的一种统一的地址格式,为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
mac地址是唯一的,那理论上,在任何两个设备之间,我应该都可以通过mac地址发送数据,为什么还需要ip地址?
mac地址就好像个人的身份证号,人的身份证号和人户口所在的城市,出生的日期有关,但是和人所在的位置没有关系,人是会移动的,知道一个人的身份证号,并不能找到它这个人,mac地址类似,它是和设备的生产者,批次,日期之类的关联起来,知道一个设备的mac,并不能在网络中将数据发送给它,除非它和发送方的在同一个网络内。
所以要实现机器之间的通信,我们还需要有ip地址的概念,ip地址表达的是当前机器在网络中的位置,类似于城市名+道路号+门牌号的概念。通过ip层的寻址,我们能知道按何种路径在全世界任意两台Internet上的的机器间传输数据。
mac地址通常是不变的,ip地址是可变的,尤其是移动设备,ip地址会经常变更。
mac地址的设计不携带设备在网络中的位置信息,想要通过mac地址通信,我们得在所有的设备上维护一张很大的表,记录所有mac地址路由在当前位置的的下一跳,这显然是不合理的。
帮助理解:
IP地址就像家里的门牌号,MAC地址就像你的身份证号,只知道MAC地址是无法知道你在什么位置的,除非是有个超大功率的扩音器,世界上所有人都能听到:*你在哪?然后你再用着一个扩音器喊:我在这。然后通信才能这样进行。而IP地址呢?不管你人去了哪?总会有个邮件地址,比如北京市海淀区闵庄路87号一样,很容易就会定位到你的位置。
四十二、为什么有了IP地址还需要MAC地址?
1.整体与局部信息传递时候,需要知道的其实是两个地址:终点地址(Final destination address)下一跳的地址(Next hop address)IP地址本质上是终点地址,它在跳过路由器(hop)的时候不会改变,而MAC地址则是下一跳的地址,每跳过一次路由器都会改变。这就是为什么还要用MAC地址的原因之一,它起到了记录下一跳的信息的作用。注:一般来说IP地址经过路由器是不变的,不过NAT(Network address translation)例外,这也是有些人反对NAT而支持IPV6的原因之一。
2.早期的『以太网』实现早期的以太网只有集线器(hub),没有交换机(switch),所以发出去的包能被以太网内的所有机器监听到,因此要附带上MAC地址,每个机器只需要接受与自己MAC地址相匹配的包。
四十三、传递到IP层怎么知道报文该给哪个应用程序,它怎么区分UDP报文还是TCP报文
根据端口区分应用程序
看ip头中的协议标识字段,17是udp,6是tcp
四十四、网络带宽、网速和流量之间的关系
网络带宽:网络带宽是指在单位时间(一般指的是1秒钟)内能传输的数据量。网络和高速公路类似,带宽越大,就类似高速公路的车道越多,其通行能力越强。网络带宽作为衡量网络特征的一个重要指标,日益受到人们的普遍关注。
通常情况下:我们说的带宽10M 20M ;现在网速网速:200KB/s ; 使用了8M的流量等,那么带宽、网速、流量之间有什么关系,他们分别代表什么呢?
(1)带宽的统计单位是:比特/秒(bps):10M=10Mbps;
(2)网速是数据传输的速度,单位是:字节/秒(B/s KB/s MB/s):1MB/s=1024KB/s ;1KB/s=1024B/s
(3)流量是用户上网发送和接收的数据量总和,单位是:字节(Byte);
比特是信息的最小单位:1字节=8比特(1B=8bit或者1B=8b);1字节/秒=8比特/秒(1B/s=8bps)
换算关系:10M带宽=1.25MB/s网速:1M带宽=0.125MB/s=128KB/s
10Mbps=10*1024Kbps=10*1024*1024bps=10*1024*1024/8 Byte/s=10/8 MB/s=1.25 MB/s
四十五、IP协议
IP相当于OSI参考模型中的网络层。网络层的主要作用是“实现终端节点之间的通信”。这种终端节点之间的通信也叫“点对点(end-to_end)通信”。数据链路层提供直连两个设备之间的通信功能。网络层的IP则负责在没有直连的两个网络之间进行通信传输。
IP大致分为三大作用模块,它们是IP寻址、路由(最终节点为止的转发)以及IP分包与组包。 IP面向无连接。即在发包之前,不需要建立与对端目标地址之间的连接。上层如果遇到需要发送给IP的的数据,该数据会立即被压缩成IP包发送出去。
在用TCP/IP通信时,用IP地址识别主机和路由器。为了保证正常通信,有必要为每个设备配置正确的IP地址。在互联网通信中,全世界都必须设定正确的IP地址。否则,根本无法实现正常的通讯。 因此,IP地址就像是TCP/IP通信的一块基石。
IP地址(IPv4)由32位正整数来表示。TCP/IP通信要求将这样的IP地址分配给每一个参与通信的主机。IP地址在计算机内部都以二进制方式被处理。 然而,由于人类社会并不习惯于采用二进制方式,需要采用一种特殊的标记方式。那就是将32位的IP地址以每8位为一组,分成4组,每组以”.”隔开,再将每组数转换为十进制数。
IP地址由“网络标识(网络地址)”和“主机标识(主机地址)”两部分组成。 IP地址分为四个级别,A、B、C、D类(还有一个一直未使用的E类)。它根据IP地址中从第1位到第4位的比特列对其网络标识和主机标识进行区分。
IP地址的网络地址部分用于进行路由控制。路由控制表中记录着网络地址与下一步应该放松至路由器的地址。在发送IP包时,首先要确定IP首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将IP包转发给相应的下一个路由器。
接下来就可以讲讲路由选择协议RIP。
四十六、当接受方的接受窗口为0时还能接受数据吗?为什么?还能接受什么数据?那怎么处理这些数据呢?
可以接受。
数据:零窗口探测报文;确认报文段;携带紧急数据的报文段
可能会被抛弃
四十七、TCP协议和IP协议有什么关系
TCP是传输层协议,IP是网络层协议。网络层为不同主机提供通信服务,而传输层为不同主机的不同应用提供服务。TCP协议负责把数据分成若干个数据包(数据报),并且给每个数据包加上包头,包头上有相应的编号,以保证数据接收端能将数据还原为原来的格式。IP协议在每个包头再加上接收端的主机地址,这样数据找到自己要去的地方。
四十八、描述RARP协议
RARP是逆地址解析协议,作用是完成硬件地址到IP地址的映射,主要用于无盘工作站,因为给无盘工作站配置的IP地址不能保存。工作流程:在网络中配置一台RARP服务器,里面保存着IP地址和MAC地址的映射关系,当无盘工作站启动后,就封装一个RARP数据包,里面有其MAC地址,然后广播到网络上去,当服务器收到请求包后,就查找对应的MAC地址的IP地址,然后装入响应包中发送回请求者。因为需要广播请求报文,因此RARP只能用于具有广播能力的网络。
四十九、IPv6
IPv6是为了根本解决IPv4地址耗尽的额问题而被标准化的网际协议。IPv4的地址长度为4个8位字节,即32比特。而IPv6的地址长度则是原来的4倍,即128比特,一般写成8个16位字节。
从IPv4切换到IPv6极其耗时,需要将网络中所有主机和路由器的IP地址进行重新设置。
IPv6的特点:
性能提升:包首部长度采用固定的值(40字节),不再采用首部检验码。简化首部结构。
支持即插即用功能:即使没有DHCP服务器也可以实现自动分配IP地址。
采用认证和加密功能。
五十、SACK(选择性确认)
1、SACK
Selective Acknowledgement,选择性确认。
2、功能
TCP收到乱序数据后,会将其放入乱序队列中,然后发送重复ACK给对端。对端如果收到多个重复的ACK,认为发生丢包,TCP会重传最后确认的包开始的后续包。这样原先已经正确传输的包可能会重复发送,降低了TCP性能。为改善这种情况,发展出SACK技术,使用SACK选项可以告知发包方收到了哪些数据,发包方收到这些信息后就会知道哪些数据丢失,然后立即重传丢失的部分。
需要注意的是只有收到失序的分组时才会可能会发送SACK,TCP的ACK还是建立在累积确认的基础上的。也就是说如果收到的报文段与期望收到的报文段的序号相同就会发送累积的ACK,SACK只是针对失序到达的报文段的。
五十一、TCP的ACK原理和延迟确认机制
ACK作用
发送方在一定时间内没有收到服务端的ACK确认包后,就会重新发送TCP数据包。发送方收到了ACK,表明接收方已经接收到数据,保证了数据的可靠达到。
ACK延迟确认机制
接收方在收到数据后,并不会立即回复ACK,而是延迟一定时间。一般ACK延迟发送的时间为200ms,但这个200ms并非收到数据后需要延迟的时间。系统有一个固定的定时器每隔200ms会来检查是否需要发送ACK包。这样做有两个目的。
1、这样做的目的是ACK是可以合并的,也就是指如果连续收到两个TCP包,并不一定需要ACK两次,只要回复最终的ACK就可以了,可以降低网络流量。
2、如果接收方有数据要发送,那么就会在发送数据的TCP数据包里,带上ACK信息。这样做,可以避免大量的ACK以一个单独的TCP包发送,减少了网络流量。
五十二、网络层和传输层的区别
网络层负责ip数据报的产生以及ip数据包在逻辑网络上的路由转发。网络层只是根据网络地址将源结点发出的数据包传送到目的结点,其主要任务是:通过路由选择算法,为报文或分组通过通信子网选择最适当的路径。
传输层提供端到端通信服务层次,提供可靠及非可靠连接。
五十二、共有IP和私有IP
什么是公有IP地址(公网IP)
组建一个企业级网络,需要去向“电信运营商ISP”申请一个接入Internet的宽带,同时ISP还会给我们分配一个或多个IP地址,这些IP地址可以供我们企业内部上网,这些ISP分配给我们的IP,就是公有IP。
公有地址(Public address,也可称为公网地址)由Internet NIC(Internet Network Information Center因特网信息中心)负责。这些IP地址分配给注册并向Internet NIC提出申请的组织机构。通过它直接访问因特网,它是广域网范畴内的。
什么是私有IP地址(私网IP)
我们企业或家庭内部组建局域网用的IP,一般都会用私有IP。
私有地址(Private address,也可称为专网地址)属于非注册地址,专门为组织机构内部使用,它是局域网范畴内的,私有IP禁止出现在Internet中,在ISP连接用户的地方,将来自于私有IP的流量全部都会阻止并丢掉。
而其中,能在Internet或被用户使用的A、B、C三类,而D类用作组播地址,E类作为科研保留地址段。