TCP原理总结——浅谈三次握手和四次挥手

TCP原理

TCP套接字中的I/O缓冲

write函数调用后并非立即传输数据,read函数调用后也并非马上接收数据。

write函数调用瞬间,数据将移至输出缓冲;

read函数调用瞬间,从输入缓冲读取数据。


缓冲特性:


补充*:

位码即tcp标志位,有6种表示:

SYN(synchronous建立连接)

ACK(acknowledgement 表示响应、确认)

PSH(push表示有DATA数据传输)

FIN(finish关闭连接)

RST(reset表示连接重置)

URG(urgent紧急指针字段值有效)


TCP内部工作原理1:与对方套接字的连接

TCP在实际通信过程中会经过三次对话过程。该过程成为三次握手。

接下来给出连接过程中实际交换的信息格式:

                                    


套接字是以全双工方式工作的。可以双向传递数据。

收发数据前需要做一些准备。


三次握手Three-way Handshake

一个虚拟连接的建立是通过三次握手来实现的

1. (B) –> [SYN] –> (A)

假如服务器A和客户机B通讯. 当A要和B通信时,B首先向A发一个SYN (Synchronize) 标记的包,告诉A请求建立连接.

注意: 一个 SYN包就是仅SYN标记设为1的TCP包(参见TCP包头Resources). 认识到这点很重要,只有当A收到B发来的SYN包,才可建立连接,除此之外别无他法。因此,如果你的防火墙丢弃所有的发往外网接口的SYN包,那么你将不能让外部任何主机主动建立连接。

2. (B) <– [SYN/ACK] <–(A)

接着,A收到后会发一个对SYN包的确认包(SYN/ACK)回去,表示对第一个SYN包的确认,并继续握手操作.

注意: SYN/ACK包是仅SYN 和 ACK 标记为1的包.

3. (B) –> [ACK] –> (A)

B收到SYN/ACK 包,B发一个确认包(ACK),通知A连接已建立。至此,三次握手完成,一个TCP连接完成


Note: ACK包就是仅ACK 标记设为1的TCP包.

需要注意的是当三此握手完成、连接建立以后,TCP连接的每个包都会设置ACK位


握手阶段:
序号         方向         seq         ack
1          A->B       10000      0
2               B->A        20000     10000+1=10001
3               A->B        10001     20000+1=20001
解释:
1:A向B发起连接请求,以一个随机数初始化A的seq,这里假设为10000,此时ACK=0

2:B收到A的连接请求后,也以一个随机数初始化B的seq,这里假设为20000,意思是:你的请求我已收到,我这方的数据流就从这个数开始。B的ACK是A的seq加1,即10000+1=10001

3:A收到B的回复后,它的seq是它的上个请求的seq加1,即10000+1=10001,意思也是:你的回复我收到了,我这方的数据流就从这个数开始。A此时的ACK是B的seq加1,即20000+1=20001



TCP的内部工作原理2:与对方主机的数据交换

通过三次握手过程完成了连接。下面正式开始收发数据。

                                        


-首先,主机A通过1个数据包发送100个字节的数据,数据包的SEQ为1200。

-主机B确认这一点,向主机A发送ACK1301消息    (ACK号 -> SEQ号 + 传递的字节数 + 1)最后加1为了告知对方下次要传  递的SEQ号。

-.......


与三次握手协议相同,最后加1是为了告知对方下次要传递的SEQ号。下面分析传输过程中数据包消失的情况:

                                          


SEQ1301包向主机B传递100字节数据,但中间发生了错误,主机B未收到。经过一段时间后,主机A仍为收到对于SEQ1301的ACK确认。因此试着重传该数据包。

为了完成数据包重传,TCP套接字启动计时器以等待ACK应答。若计时器超时则重传。


TCP的内部工作原理3:断开与套接字的连接      

四次挥手Four-way handshaking                                      

                                             

先由A向套接字B传递断开连接的消息(FIN),套接字B发出确认收到的消息(ACK),然后向套接字A传递可以断开连接的消息(FIN),套接字A同样发出确认消息(ACK)。


数据包中的FIN表示断开连接。双方各发送一次FIN消息后断开连接。

这个过程称为四次挥手。



全过程配图:

        

猜你喜欢

转载自blog.csdn.net/amoscykl/article/details/80189007