一、TCP报文格式
TCP(Transmission Control Protocol)传输控制协议是一种面向连接的、可靠的、基于字节流的传输层协议。
TCP首部承载这TCP协议需要的各项信息,下面我们来分析一下:
-
TCP端口号 TCP的连接是需要四个要素确定唯一一个连接: (源IP,源端口号)+ (目地IP,目的端口号) 所以TCP首部预留了两个16位作为端口号的存储,而IP地址由上一层IP协议负责传递 源端口号和目地端口各占16位两个字节,也就是端口的范围是2^16=65535 另外1024以下是系统保留的,从1024-65535是用户使用的端口范围 -
TCP的序号和确认号: 32位序号 seq:Sequence number 缩写seq ,TCP通信过程中某一个传输方向上的字节流的每个字节的序号,通过这个来确认发送的数据有序,比如现在序列号为1000,发送了1000,下一个序列号就是2000。 32位确认号 ack:Acknowledge number 缩写ack,TCP对上一次seq序号做出的确认号,用来响应TCP报文段,给收到的TCP报文段的序号seq加1。 -
TCP的标志位 每个TCP段都有一个目的,这是借助于TCP标志位选项来确定的,允许发送方或接收方指定哪些标志应该被使用,以便段被另一端正确处理。 用的最广泛的标志是?SYN,ACK?和?FIN,用于建立连接,确认成功的段传输,最后终止连接。
- SYN:简写为
S ,同步标志位,用于建立会话连接,同步序列号; - ACK: 简写为
. ,确认标志位,对已接收的数据包进行确认; - FIN: 简写为
F ,完成标志位,表示我已经没有数据要发送了,即将关闭连接; - PSH:简写为
P ,推送标志位,表示该数据包被对方接收后应立即交给上层应用,而不在缓冲区排队; - RST:简写为
R ,重置标志位,用于连接复位、拒绝错误和非法的数据包; - URG:简写为
U ,紧急标志位,表示数据包的紧急指针域有效,用来保证连接不被阻断,并督促中间设备尽快处理;
TCP报文格式、TCP三次握手、四次挥手
二、 三次握手
三次握手,为什么要三次握手,两次握手不行吗?
TCP/IP协议是传输层的一个面向连接的安全可靠的传输协议,三次握手的机制是为了保证能建立一个安全可靠的连接。
第一次握手由客户端发起,客户端会向服务端发送一段报文,在报文里面SYN位标志位是置1的,当服务端收到这段报文之后,就知道客户端要给我发起一段新的连接,于是,服务端就向客户端发起一个确认消息包,这个消息包里面ACK位置1。
以上两次握手之后,对于客户端而言,已经知道了所有的信息,我既能给服务端发消息,我还能收到服务端的消息,但是,对于服务端而言,两次握手是不够的,因为到目前为止,服务端只知道一件事情,就是客户端给我的消息,我能收到,但是,我发给客户端的消息,客户端能不能收到不知道。
所以,还需要进行第三次握手。第三次握手就是,当客户端收到服务端,发过来的确认消息的报文之后,还要继续给服务端一个回应,也是一个ACK位置1的确认消息。通过以上三次握手,不管是服务端还是客户端,都彼此知道了,我既能给对方发消息,也能够收到对方的消息,那么这个连接就可以被安全的建立了。
三、四次挥手
为什么要进行四次挥手?
四次挥手也是由客户端首先发起的,客户端会发起一段报文,在报文里面,FIN位标志位置1,当服务端收到这段报文之后,我就知道了客户端想要跟我断开连接,
但是,此时,服务端不一定能做好准备,因为当客户端发起断开连接的消息的时候,对于服务端而言,它极有可能还有未发送完的消息需要继续发送,
所以,此时对于服务端而言,只能进行消息确认,我先告诉客户端,我知道你要跟我断开连接了,但是,我这边还没有做好准备,你先等我一下,等会我会告诉你。
发我消息确认包之后,可能稍过片刻,它就会发送一个FIN位,置1的断开连接的报文,是由服务端发送给客户端的,这个报文表示了,服务端已经做好了断开连接的准备,
当这个报文发送给客户端的时候,客户端同样要给服务端发送一个ACK位置1的消息确认的报文。
一共有四次,通过这四次的相互沟通和连接,我就知道了不管是服务端,还是客户端都已经做好了断开连接的准备,于是连接就可以被断开了。
这是我对三次握手和四次挥手的一个理解。
视频教程、视频教程
|