一.TCP协议简介
TCP是TCP/IP体系中非常复杂的一个协议,TCP最主要的特点有:
1.TCP是面向连接的运输层协议。应用程序在使用TCP协议之前,必须先建立TCP连接。在传递数据完毕后,必须释放已建立的TCP连接。
2.每一条TCP连接只能有两个端点,只能说点对点的。
3.TCP提供可靠交付的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,并且按序到达。
4.TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。
5.面向字节流。TCP中的“流”指的是流入到进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。TCP并不知道所传送的字节流的含义。TCP不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系。但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。当然,接收方的应用程序必须有能力识别收到的字节流,把它还原成有意义的应用层数据。
TCP报文段先要传到IP层,加上IP首部后,再传送到数据链路层。再加上数据链路层的首部和尾部,才离开主机发送到物理链路。
a.TCP和UDP在发送报文时所采用的方式完全不同。TCP并不关心应用程序一次把多长的报文发送到TCP缓存中,而是根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节(UDP发送的报文长度是应用程序给出的)。
b.如果应用程序传送到TCP缓存的数据块太大,TCP就可以把它划分短一些再传。TCP也可以等待积累有足够多的字节后再构建成报文段发送出去。
二:TCP包头格式
TCP协议重定解决的问题:
顺序问题,稳重不乱;丢包问题,承诺靠谱;连接维护,有始有终;流量控制,把握分寸;拥塞控制,知进知退。
TCP把连接作为最基本的抽象,每个TCP连接有两个端点。TCP连接的端口叫做套接字,端口号拼接到IP地址即构成了套接字(如:192.3.4.5:80)。
1.源端口号和目标端口号是不可少的,这一点和UDP是一样的,如果没有这两个端口号,数据就不知道应该发送给哪个应用。
2.包的序号:为了解决乱序的问题
3.确认序号:发出去的包应该有确认,如果没有收到就应该重新发送,直到送达,这个可以解决不丢包的问题
4.状态位:ACK是回复,RST是重新连接,FIN是结束连接。
三:TCP连接三次握手
1.一开始,客户端和服务端都处于CLOSED状态
2.先是服务端主动监听某个端口,处于LISTEN状态
3.客户端主动发起连接SYN,之后处于SYN-SENT状态
4.服务端收到发起的连接,返回SYN,并且ACK客户端的SYN,之后处于SYN-RCVD状态
5.客户端收到服务端发送的SYN和ACK之后,发送ACK的ACK,之后处于ESTABLISHED状态。
6.服务端收到ACK的ACK之后,处于ESTABLISHED状态。
四:TCP连接释放四次挥手
1.当前A和B都处于ESTAB-LISHED状态。
2.A的应用进程先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。
3.B收到连接释放报文段后即发出确认,然后B进入CLOSE-WAIT(关闭等待)状态。TCP服务器进程这时应通知高层应用进程,因而从A到B这个方向的连接就释放了,这时TCP连接处于半关闭状态,即A已经没有数据发送了。
从B到A这个方向的连接并未关闭,这个状态可能会持续一些时间。
4.A收到来自B的确认后,就进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文端。
5.若B已经没有向A发送的数据,B发出连接释放信号,这时B进入LAST-ACK(最后确认)状态等待A的确认。
6.A再收到B的连接释放消息后,必须对此发出确认,然后进入TIME-WAIT(时间等待)状态。请注意,现在TCP连接还没有释放掉,必须经过时间等待计时器(TIME-WAIT timer)设置的时间2MSL后,A才进入CLOSED状态。
7。B收到A发出的确认消息后,进入CLOSED状态。
五:TCP状态机