1、TCP报文
重要的标志我在图中也有标记,重点了解标志位
- ACK:确认序号有效,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。
- RST:重置连接,当RST=1时,表示出现严重错误,必须释放连接,然后再重新建立
- SYN:发起一个新连接,SYN=1而ACK=0,表明它是一个连接请求;SYN=1且ACK=1,则表示同意建立一个连接
- FIN:释放一个连接,FIN为1时,表示数据已经发送完毕,希望释放连接
- URG:紧急指针,为1时表示紧急指针有效,为0则忽略紧急指针。
- PSH: 表示强迫数据传输,置1时请求的数据段在接收方得到后就可直接送到应用程序,而不必等到缓冲区满时才传送。对于http来说,多媒体文件,像图片等一般来说比较大,不可能像证书链完全传输完成之后,仅仅在最后一个报文在再通知接收方向上层扔数据。因此我们看到传输过程中每隔一些报文,PUSH字段就设置上了。
2、三次握手和四次分手
2.1 三次握手
(1) 客户端我们用A表示,服务器端用B表示
(2)前提: A主动打开,B被动打开
第一次握手
客户主动(active open)去connect服务器,并且发送SYN 假设序列号为J,
服务器是被动打开(passive open)
第二次握手
服务器在收到SYN后,它会发送一个SYN以及一个ACK(应答)给客户,
ACK的序列号是 J+1表示是给SYN J的应答,新发送的SYN K 序列号是K
第三次握手
客户在收到新SYN K, ACK J+1 后,也回应ACK K+1 以表示收到了,
然后两边就可以开始数据发送数据了
2.2 四次分手
由于TCP连接时是全双工的,因此每个方向都必须单独进行关闭.这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的链接。收到一个FIN只是意味着这一方向上没有数据流动,既不会在收到数据,但是在这个TCP连接上仍然能够发送数据,知道这一方向也发送了FIN,首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。
前提:A主动关闭,B被动关闭
CP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。
第一次分手
客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。
第二次分手
服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
第三次分手
服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
第四次分手
客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。