常见的面试题之一
TCP建立(三次握手)
1. Client 首先发送SYN包(syn = i )到 Server端,并进入SYN_SEND状态,等待服务器确认。
2 . Server端收到Client端的syn包后,将会通知Client收到该Syn包(即:发送ack = i +1),同时发送给Client一个Syn包(syn = j),即syn + ack,此时,服务器进入SYN_RECV状态
3。Client收到Server的syn+ack包,同时向Server发送确认包ack (ack = j + 1)
至此,Client和Server进入ESTABLISHED状态,完成三次握手。
TCP断开(四次握手)
1. Client首先向Server端发送fin包(fin = m)
2. Server端收到fin包后,发送确认包ack(ack = m + 1),Client收到Server端的ack后,将会等待server的fin包。
3. Server发送fin包(fin = n)到Client端
4. Client收到fin包,并发送ack = n + 1
之后,Client和Server将断开连接。(在发送fin包之后表示该端不能继续发送数据了,但还可以接受数据)
术语解释:(来自百度百科)
SYN (synchronize):
SYN是TCP/IP建立连接时使用的握手信号。在客户机和服务器之间建立正常的TCP网络连接时,客户机首先发出一个SYN消息,服务器使用SYN-ACK应答表示接收到了这个消息,最后客户机再以ACK消息响应。这样在客户机和服务器之间才能建立起可靠的TCP连接,数据才可以在客户机和服务器之间传递。
TCP连接的第一个包,非常小的一种数据包。SYN 攻击包括大量此类的包,由于这些包看上去来自实际不存在的站点,因此无法有效进行处理。每个机器的欺骗包都要花几秒钟进行尝试方可放弃提供正常响应。
ACK (Acknowledgement):
在数据通信传输中,接收站发给发送站的一种传输控制字符。它表示确认发来的数据已经接受无误。
在TCP/IP协议中,如果接受方成功的接收到数据,那么会回复一个ACK数据。通常ACK信号有自己固定的格式,长度大小,由接受方回复给发送方。其格式取决于采取的网络协议。当发送方接收到ACK信号时,就可以发送下一个数据。如果发送方没有收到信号,那么发送方可能会重发当前的数据包,也可能停止传送数据。具体情况取决于所采用的网络协议。ACK信号通常是一个ASCII字符,不同的协议中ACK信号都不一样。
TCP报文格式中的控制位由6个标志比特构成,其中一个就是ACK,ACK为1表示确认号有效,为0表示报文中不包含确认信息,忽略确认号字段。