目录
4、在三次握手过程中,如果服务器一直收不到客户端的ack会发生什么?
3、socket中的close是一次就关闭的吗?半关闭状态是怎么产生的?
1、为什么需要TIME_WAIT状态?为什么 TIME_WAIT 状态还需要等 2MSL后才能返回到 CLOSED 状态?
五、connect()、listen()和accept()三者之间的关系
一、TCP报文(标准长度20字节)
TCP数据包每次能够传输的最大长度 = MTU(1500B) - IP头(20B)- TCP头(20B)= 1460Bytes。
【重要的字段】:
-
源端口号与目的端口号:标识了发送方与接收方的地址,IP地址和端口号合称为套接字。
-
序列号和确认号:32位序列号与32位确认序号:序列号与确认号可以理解成两个通信进程在收发数据的时候互相应答的信息。比如说:A进程从序列号1000开始给B进程发送数据,发送五个数据。那么在B收到数据回复的时候,这里A的确认序列号应该是从1006,如果不是1006,比如说是1003,那就意味着1004、1005数据包B没有收到,于是A启动重发机制。这也就保证了数据的可靠性,也是TCP的特点之一。序列号是进程发送消息的号码,而确认号是期望目的进程返回的号码。进行比对,从而验证数据包是否到达。
-
4位TCP报头长度:这里的四位TCP报头长度,可以理解成四个比特位表示长度,四位比特位表示的值乘以四就是该TCP头部的长度。由图可知,报头最短长度为20字节,也就是说这里的四位TCP报头长度默认为0101。并且TCP报头长度不可超过15*4=60个字节。
-
标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
- URG:紧急指针(urgent pointer)有效;
- ACK:确认序号有效;
- PSH:接收方应该尽快将这个报文交给应用层;
- RST:重置连接;
- SYN:发起一个新连接;
- FIN:释放一个连接。
-
16位窗口大小:窗口大小标志着TCP缓冲区内部剩余空间的大小,起到一个流量控制的作用。如果窗口满了,那么这个时候是不允许数据接收的。后面到达的数据会被丢失。
-
16位校验和:这里的校验和由发送端填充,CRC校验。接收端校验数据的时候如果校验不通过,那么认为数据有问题。此处的校验和不仅仅校验TCP首部,还校验数据部分。
-
16位紧急指针:标识哪部分的数据为紧急数据。
二、三次握手
在 TCP/IP 协议中,TCP 协议提供可靠的连接服务,采用三次握手建立一个连接。
-
第一次握手:Client先产生一个初始序列号Seq = ISN(C), 作为SYN并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
-
第二次握手:Server收到数据包后也发送自己的SYN报文作为响应,并初始化序列号Seq = ISN(S),为了确认Client的Seq,Server将Client发送的Seq加1,作为ACK发送给Client,Server进入SYN_RCVD状态。(SYN为synchronize的缩写,ACK为acknowledgment的缩写)。
-
第三次握手:为了确认Server的SYN,Client将Server发送的Seq加1,作为ACK发送给Server。Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
通过这样的三次握手,客户端与服务端建立起可靠的双工的连接,开始传送数据。 三次握手的最主要目的是保证连接是双工的,可靠更多的是通过重传机制来保证的。
1、半连接、半打开、半关闭状态
-
半连接状态:发生在TCP三次握手过程中,客户端向服务器发起连接,服务器也进行了回应,但是客户端却不进行第3次握手。
-
半打开状态:在TCP连接中,如果某一端关闭了连接或者是异常关闭,则该连接处于半打开状态。解决半打开问题:引入心跳机制就可以察觉半打开状态。
-
半关闭状态:当TCP链接中客户端向服务器发送 FIN 请求关闭,服务端回应ACK之后,并没有立即发送 FIN 给客户端,客户端就处于半关闭状态,此时客户端可以接收服务器发送的数据,但是客户端已经不能再向服务器发送数据。
2、SYN flood攻击
在三次握手过程中,服务器发送SYN-ACK之后,收到客户端的ACK之前的TCP连接称为半连接(half-open connect)。此时服务器处于SYN_RCVD状态。当收到ACK后,服务器转入ESTABLISHED状态。
Syn攻击就是攻击客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。
// 检测是否被Syn攻击
netstat -n -p TCP|grep SYN_RCVD
一般较新的TCP/IP协议栈都对这一过程进行修正来防范Syn攻击,修改tcp协议实现。主要方法有SynAttackProtect保护机制、SYN cookies技术、增加最大半连接和缩短超时时间等。但是不能完全防范syn攻击。
3、为什么需要三次握手?
为了保证服务端能收接受到客户端的信息并能做出正确的应答而进行前两次(第一次和第二次)握手,为了保证客户端能够接收到服务端的信息并能做出正确的应答而进行后两次(第二次和第三次)握手。可以用聊天来类比:
- 甲—>乙:你吃饭了吗?
- 已—>甲:我吃了,你呢?
- 甲—>乙:我也吃了。
4、在三次握手过程中,如果服务器一直收不到客户端的ack会发生什么?
服务端会给每个待完成的半连接都设一个定时器,如果超过时间还没有收到客户端的ACK消息,则重新发送一次SYN-ACK消息给客户端,直到重试超过一定次数时才会放弃。这个时候服务器需要分配内核资源维护半连接。
5、初始序列号Seq为什么要随机初始化?
这样做主要是为了保证网络安全