tcp三次握手,四次挥手

来源:互联网 发布:萨博沃顿软件 编辑:程序博客网 时间:2024/06/01 07:48

TCP传输协议

  1. TCP传输协议能提供客户和服务器的连接。
  2. TCP向另一端发送数据时,他要求对方发送一个确认信号,如果没有收到确认信号,TCP则等待更长时间或重传数据。
  3. TCP通过给发送数据的每一个字节都关联一个序列号进行排序,因此接受方收到TCP数据后,会将数据重新排列,如果
    发现接收到的数据时重复的,则丢弃。
  4. TCP提供流控制。tcp总是告诉对方他能接收多少数据,从而保证对方发送的数据不会溢出。如果TCP的接收缓冲区已满,
    就必须等待其他应用进程将数据取走后才能继续接收数据传输

三次握手

  1. 服务器必须准备好接收外来的连接,通过调用socket,bind,listen等函数进行一系列的初始化,成为被动打开
  2. 客户调用connect函数主动打开。客户TCP发送一个SYN信号(同步信号),他告诉服务器将在连接中发送的数据的初始序列号。一般情况下SYN信号不携带数据,只包括IP头部、TCP头部和可能有的TCP选项。
  3. 服务器必须确认客户的SYN信号,同时自己也发送一个SYN信号,它含有服务器将在同一连接中发送的数据的初始 序列号,服务器以单个分节向用户发送SYN和对客户SYN的ACK
  4. 客户必须确认服务器的ACK
    这里写图片描述

面试时被问到如果三次握手的最后一个ACK发送,但是丢失,TCP的处理方式

三次握手的第三个ACK包丢了——客户端认为连接建立,写数据时,会触发RST
这里写图片描述
当Client端收到Server的SYN+ACK应答后,其状态变为ESTABLISHED,并发送ACK包给Server;
如果此时ACK在网络中丢失,那么Server端该TCP连接的状态为SYN_RECV,并且依次等待3秒、6秒、12秒后重新发送SYN+ACK包,以便Client重新发送ACK包。
Server重发SYN+ACK包的次数,可以通过设置/proc/sys/net/ipv4/tcp_synack_retries修改,默认值为5.

如果重发指定次数后,仍然未收到ACK应答,那么一段时间后,Server自动关闭这个连接。
但是Client认为这个连接已经建立,如果Client端向Server写数据,Server端将以RST包响应,方能感知到Server的错误

四次挥手
1. 某个应用进程首先调用close函数,称这一端执行主动关闭。这一端的TCP发送一个FIN分节,表示数据发送完毕
2. 接收FIN分节的另一端执行被动关闭,这个FIN有tcp确认,它的接收也作为文件结束符传递给接收方应用进程。因为FIN意味着应用进程在相应连接上再也接收不到额外数据。
3. 一段时间后,接收到文件结束符的应用进程将调用close函数,关闭他的套接口。这导致他的tcp也会发送一个FIN
4. 接收到FIN的员发送发对他进行确认。
这里写图片描述

tcp连接分组交换

这里写图片描述