TCP:传输控制协议。是一种面向连接的协议,提供可靠的双全工的字节流,TCP套接口是流套接口的一种,关心确认、超时和重传等具体细节。
TCP提供客户和服务器连接,跨该连接与服务器交互数据。提供可靠的双全工的字节流,TCP必须跟踪每个方向数据流的状态信息,
TCP提供可靠性,当TCP向另一端发送数据时,要求另一端返回确认。TCP不是100%可靠,它提供的是数据的可靠投递或故障的可靠通知。
TCP通过给所发送数据的每一个字节关联一个序列号进行排序,并可以判定重复。
TCP提供流量控制。TCP总是告诉对端它能够接受多少字节的数据,这称为通告窗口。该窗口在任何时刻都住处接受缓冲区的可用空间,从而确保发送端发送的数据不会溢出接受缓冲区。缓冲区满,必须等待应用进程从这个缓冲区读取数据从能接受从发送端来的数据。
TCP连接的建立和终止
三次握手:
- 前提,服务方必须准备好接受外来的链接,可通过socket、bind和listen函数来完成。
- 1客户端向服务器发出连接请求报文,这时报文首部中的同部位SYN=1,同时随机生成初始序列号 seq=x,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。这个三次握手中的开始。表示客户端想要和服务端建立连接。
- 2客户端向服务器发出连接请求报文,这时报文首部中的同部位SYN=1,同时随机生成初始序列号 seq=x,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。这个三次握手中的开始。表示客户端想要和服务端建立连接。
- TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。这里客户端表示我已经准备好。
TCP选项,每个SYN可以含有若干个TCP选项:
MSS选项:最大分节大小MSS即能接受的每个TCP分节中的最大数据量。
窗口规模选项:动态改变窗口大小
时间戳选项:防止失而复得的分组可能造成的数据损坏。
四次挥手:
- TCP发送一个FIN(结束),用来关闭客户到服务端的连接。客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1)
- 服务端收到这个FIN,他发回一个ACK(确认),确认收到序号为收到序号+1,和SYN一样,一个FIN将占用一个序号。 服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
- 服务端发送一个FIN(结束)到客户端,服务端关闭客户端的连接。服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
- 客户端发送ACK(确认)报文确认,并将确认的序号+1,这样关闭完成。
TIME-WAIT状态的理由:
1.可靠的事项TCP双全工连接的终止。
最终的ACK丢失,服务端将重发最终的FIN,客户端必须未婚状态信息以允许他重发最终的ACK。
2.允许老的重复分节在网络中消失。
防止同一个IP新建的链接,不使用相同的端口号,让来自之前链接的消息在网络中消逝(某个方向上的分组最多存货MSL秒即被丢弃)。
常用的netstat命令的输出包括TCP状态轮换图中的这些状态
TCP缓冲区:
每一个TCP套接口有一个发送缓冲区,当应用进程调用write时,内核从应用进程的缓冲区中拷贝所有数据到套接口的发送缓冲区。如果发送缓冲区容不下所有数据(应用进程缓冲区大于发送缓冲区或发送缓冲区中有其他数据),应用进程被挂起(假设是阻塞的),内核将不从write系统调用返回,直到应用进程缓冲区中的所有数据都拷贝到发送缓冲区。TCP套接口的write调用成功返回仅仅表示我们可以重新使用应用进程缓冲区,并不是对端的TCP已经接收到数据。
对端TCP必须确认收到的数据,只有收到对端的ACK,本端才能删除套接口发送缓冲区中已确认的数据。TCP必须保留数据拷贝直到对端确认为止。
TCP以MSS大小的或更小的快把数据传递给IP,同时给每个数据按上一个TCP头部以构成TCP分节。
欢迎关注订阅微信公众号,程序员的压哨绝杀,一起分享生活工作中的见闻趣事。