1、TCP为何采用三次握手来建立连接,可否采用两次握手,请说明原因
不可以。采用三次握手是为了防止失效的连接请求报文突然又传送到服务器,从而发生错误。当客户发出的连接请求报文段由于某些原因,没有到达服务器,在客户端等待一段时间后,又重新向服务器发送连接请求,且顺利建立连接,完成数据传输。第一次发送的连接请求报文段称为失效报文段。
考虑这样的情况:客户端第一次发送的请求没有丢,而是因网络问题延迟到达服务器,服务器以为是客户端又发送新的连接情求,于是同意连接,并向客户发回确认。但此时,客户端不予理会,服务器就会一直等待客户端发送数据,导致服务器的资源浪费。
2、TCP三次握手有什么漏洞
泛洪攻击SYN Flood
SYN Flood利用了TCP协议三次握手的过程来达到攻击的目的。三次握手的第三步中如果服务器没有收到客户端的ACK报文,服务端一般会进行重试,也就是再次发送SYN+ACK报文给客户端,并且一直处于SYN_RECV状态,将客户端加入等待列表。重发一般会进行3~5次,大约每隔30秒左右会轮询一遍等待队列,重试所有客户端;另一方面,服务端在发出SYN+ACK报文后,会预分配一部分资源给即将建立的TCP连接,这个资源在等待重试期间一直保留,服务器资源有限,可以维护的等待队列超过极限后就不再接收新的SYN报文,也就是拒绝建立新的TCP连接。
攻击者伪造大量的IP地址给服务器发送SYN报文,但是由于伪造的IP地址几乎不可能存在,也就不可能从客户端得到任何回应,服务端将维护一个非常大的半连接等待列表,并且不断对这个列表中的IP地址进行遍历和重试,占用了大量的系统资源。服务器资源有限,大量的恶意客户端信息占满了服务器的的等待队列,导致服务器不再接收新的SYN请求,正常用户无法完成三次握手与服务器进行通信。
3、TCP为何采用四次挥手来释放连接
关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方已经将所有数据发送完毕了。此时,由于当前端并不一定将需发送的数据向对方发送完毕,并不会马上关闭socket。当前段将所有数据发送完成后,也会向对方发送FIN,表示已经数据发送完毕。针对每一个FIN都需要一个ACK,因此需要四次挥手。
如果收到FIN报文通知时,恰好当前端已经将所有数据发送完毕,则可将ACK+FIN一同发送给对方,对方收到后,只需要回传一个ACK即可,此时仅需要三次挥手。
4、TCP定时器
TCP为每条链接建立7个定时器,依次为:连接建立,重传,延迟ACK,持续,保活,FIN_WAIT2,TIME_WAIT。
5、IP知识
主机号全0:网络本身
主机号全1:网络的广播地址
127.0.0.1:网络保留做环路自检地址,表示任意主机本身
32位全0:整个TCP/IP网络
32位全1:整个TCP/IP网络的广播地址
私有地址:
10.0.0.0-10.255.255.255
172.16.255.255-172.31.255.255
192.168.0.0-192.168.255.255
6、网络相关命令
ping:发送数据包,并要求对方返回数据包,(非协议,是应用程序)
tracert:显示每跳路由情况
telnet:是Internet远程登陆服务的标准协议和主要方式
netstat:可以显示路由表,实际网络连接以及每一个网络接口设备的状态。
7、TCP如何确保可靠性
在TCP的连接中,数据流必须以正确的顺序送达对方,TCP的可靠性是通过顺序编号和确定(ACK)来实现的,TCP在开始传送一个段时,为准备重传而首先将该段插入到发送队列中,同时启动时钟。其后,如果收到接受端对该段的ACK确认,则将该段从队列中删除。如果规定时间内,ACK未返回,则从发送队列中再次发送出这个段。
TCP协议对数据传输做了保障,UDP是面向不可靠连接的,不能保证数据正确达到目的地。
8、Http与Https的区别
Http缺省工作在TCP协议80端口,用户访问http://开头的都是标准http服务,其封装的信息是明文,通过抓包工具可以分析其内容。
Https缺省工作在443端口,它的工作流程一般如下方式:
1)完成TCP三次握手
2)客户端验证服务器数字证书
3)DH算法协商对称加密算法密钥,hash算法密钥
4)SSL加密方式传输,采用协商的对称加密算法和密钥解密,保证数据机密性,完整性,防止数据被截获或篡改。
9、滑动窗口机制
作用:
1、提供TCP可靠性;2、提供TCP流控特性,保证字节流顺序到达
基本原理:
1)对于TCP会话发送端,任何时候在发送缓存区内的数据都可分为4类:已发送且已收ACK,已发送未收到ACK,未发送但允许发送,未发送不允许发送。已发送但还未收到ACK的“未发送”但允许发送的称为发送窗口。
当收到新ACK对发送窗口的确认时,窗口滑动
2)对TCP的接收方,在某一时刻接受缓存区只有三种:已接收,未接受准备接受,未接受且尚未准备接受。注意:不存在已接收未回复ACK的
接受窗口大小取决于应用,系统,硬件的限制,各自的“发送窗口”则取决于对端通告“接受端口”。
10、阻塞模式与非阻塞模式有什么区别?
使用socket编程实现数据传输过程,通常默认套接字是阻塞的。每个TCP套接字有一个发送缓冲区,当应用程序调用write操作时,内核从应用进程缓冲区复制数据到套接字缓冲区。如果发送缓冲区无法完全容纳应用程序的所有数据,即应用进程缓冲区大于发送缓冲区或者发送缓冲区还有其他数据,应用进程将会被挂起,内核不从write返回,直到应用进程缓冲区所有数据都复制到套接字发送缓冲区。
因此,写一个TCP套接字write调用成功并不意味着对端应用程序已经接受到数据,仅仅表示可以重新使用应用进程的缓冲区了。
下面从发送和接受两方面说明阻塞与非阻塞的区别:
1、对于一个TCP套接字,内核将从应用进程缓冲区向套接字的发送缓冲区复制数据,对于阻塞的套接字,如果其发送缓冲区没有足够的空间,进程将被挂起。
对于非阻塞的TCP套接字,如果其发送缓冲区没有空间,发送函数将立即返回并设置EWOULDBLOCK错误,如果发送缓冲区还有一些空间,返回值将是复制到该缓冲区的字节数。
UDP套接字不存在真正的发送缓冲区。内核只是复制应用进程数据并把它沿协议栈向下传送,依次加上UDP头部和IP头部。因此,UDP的发送阻塞原因与TCP不同。
2、如果某个进程对阻塞TCP调用接受函数,而接受缓冲区没有数据可读,则进程将被挂起,直到有数据到达。TCP是字节流协议,只要到达一些数据,该进程将会被唤醒:这些数据可能是单字节,也可以是一个完整的TCP分节中的数据。
UDP是数据报协议,如果一个阻塞的UDP套接字接受缓冲区为空,对它调用接受函数的进程将被挂起,直到到达一个UDP数据包。对于阻塞的套接字,如果接受操作不能被满足,相应的调用将立即返回一个EWOULDBLOCK错误。
11、HTTPS与HTTP的区别
1)HTTPS协议需要CA申请证书,一般免费证书较少,需要交费
2)HTTP是超文本传输协议,信息是明文传递,HTTPS则是具有安全性的ssl加密传输协议。
3)HTTP和HTTPS使用的是完全不同的连接方式,使用的端口也不同,HTTP80,HTTPS443.
4)HTTP连接很简单,是无状态的,HTTPS协议由SSL+HTTP协议构建,可进行加密传输,身份认证,比HTTP安全。
5)目前HTTPS应用比HTTP少,主要因为前者比较消耗性能,对安全性没那么高的应用而言,HTTP已经足够了。