学习视频:TCP三次握手四次挥手
TCP报文格式
源端口号和目的端口号
:同IP数据报中的源IP与目的IP唯一确定一条TCP连接
序号seq(4字节=32位):
用来标识TCP发端向TCP收端发送的数据字节流
确认序号(4字节=32位):
当ACK标志位为1时,确认序号为接收对端的报文序号(seq+1)
头部长度:
该字段占用4位,用来表示报文首部的长度,单位是4Byte
预留6位:
长度为6位,作为保留字段,暂时没有什么用处。
URG:
长1位,表示紧急指针字段有效;
ACK:
长1位,置位表示确认号字段有效;TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1
PSH:
长1位,表示当前报文需要请求推(push)操作;
RST:
长1位,置位表示复位TCP连接;
SYN:
长1位,在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此,SYN置1就表示这是一个连接请求或连接接受报文。
FIN:
长1位,用于释放TCP连接时标识发送方比特流结束;即完终结的意思, 用来释放一个连接。当 FIN = 1时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。
窗口大小:
长度为16位,2个字节。
校验和:
长度为16位,2个字节。
紧急指针:
长度为16位,2个字节。
TCP三次握手
面试回答:
TCP/IP 协议是传输层的一个面向连接的安全可靠的能建立一个安全可靠的连接,那么第一次握手是由客户端发起,客户端会向服务端发送一个报文,在报文里面:SYN标志位置为1,表示发起新的连接。当服务端收到这个报文之后就知道客户端要和我建立一个新的连接,于是服务端就向客户端发送一个确认消息包,在这个消息包里面:ACK标志位置为1,表示确认客户端发起的第一次连接请求。以上两次握手之后,对于客户端而言:已经明确了我既能给服务端成功发消息,也能成功收到服务端的响应。但是对于服务端而言:两次握手是不够的,因为到目前为止,服务端只知道一件事,客户端发给我的消息我能收到,但是我响应给客户端的消息,客户端能不能收到我是不知道的。所以,还需要进行第三次握手,第三次握手就是当客户端收到服务端发送的确认响应报文之后,还要继续去给服务端进行回应,也是一个ACK标志位置1的确认消息。通过以上三次连接,不管是客户端还是服务端,都知道我既能给对方发送消息,也能收到对方的响应。那么,这个连接就被安全的建了。
TCP四次挥手
面试回答:
由客户端首先发起的,第一次挥手客户端会发送一个报文,在报文里面FIN标志位置1,当服务端收到这个报文就知道了客户端想要和我断开连接,但是此时服务端不一定能做好准备,因为当客户端发起断开连接的请求后,对于服务端而言还极有可能有未发送完的消息,还需继续发送,所以此时对于服务端而言只能进行一个消息确认(第二次挥手),即告诉客户端我知道你要和我断开连接,但是我这边还可能没有做好准备,你需要等我一下,等会儿我会告诉你(第三次挥手),于是,发完这个消息确认包过后,可能稍过片刻,服务端会继续发送一个断开连接的报文(第三次挥手),FIN位置1的报文,表示服务端已经做好断开连接的准备,当这个报文发给客户端的时候,客户端同样要给服务端发送一个消息确认的报文(第四次挥手),经过这四次的相互沟通和连接,我就知道了不管是客户端还是服务端都已经做好了断开连接的准备,于是连接断开了