TCP基础

TCP协议(传输控制协议)

特点:面向连接

        面向字节流

        可靠传输

TCP报头协议

TCP基础


源端口/目的端口号:表示数据从哪里来,到哪个进程去

序号:tcp报文按序发送

确认号:告诉发送者,我已经收到了那些数据

4位TCP报头长度:表示该TCP头部有多少个32位bit,所以TCP头部最大长度为15*4=60;

6位标志位

  • URG:紧急指针是否有效
  • ACK:确认号是否有效
  • PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走
  • RST:对方要求重新建立连接;我们把携带RST标识的称为复位报文段ack发送失败
  • SYN:请求建立连接,我们把携带SYN标识的称为同步报文段
  • FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段。

16位窗口大小:填写的是自己的缓冲区大小

16位校验和:发送段填充,CRC校验,接收端校验不通过,则认为数据有问题,此处的校验和不光包含TCP首部,也包含TCP数据部分。

16位紧急指针:标识哪部分数据是紧急数据。

连接管理机制

正常情况下,TCP要经过三次握手建立连接,四次挥手断开连接

TCP基础


三次握手:服务器段调用listen后进入监听状态,邓艾客户端连接,一旦听到连接请求,就将该链接放入到内核等待队列中,并向客户端发送SYN确认报文

服务端一旦接收到客户端的确认报文,就进入到建立连接状态,可以进行读写数据了,

四次挥手:当客户端主动关闭连接(调用close),服务器会受到结束报文段,服务器返回确认报文段就进入close_wait,

进入close_wait后说明服务器准备关闭连接(需要处理完之前的数据),当服务器真正调用close关闭连接时,会向客户端发送FIN,此时服务器进入last_ack状态,等待最后一个ack到来,服务器收到了对FIN的ack,彻底关闭连接

从time_wait到close待客户端要等待一个2MSL(报文最大生存时间),因为害怕ACK发送失败以及等待服务器端再次发送FIN。

客观上说在服务器的TCP连接没有完全断开之前是不允许重新监听的。(但有时候又必须得重新唤醒服务器。后面仔讲解决办法)