目录
二十六、同一个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报文就被拦截。下面为防护示意图: