TCP协议主要特点:
首部占20个字节
(1)面向连接;通信之前必须建立连接
(2)每一条TCP连接只能是点对点的(一对一);
(3)提供可靠交付的服务;通过TCP连接传输的数据,无差错,不丢失,不重复。
(4)提供全双工通信;
(5)面向字节流。虽然程序和TCP交互是一次一个数据块,但是Tcp把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。
TCP报文的结构
各个字段的作用与含义:
1)源端口号和目的端口号各占两个字节,我们知道端口号就是标识特定主机上的唯一的进程,而IP地址是来表示标识网络中的不同主机的,这两个源(source)和目的(dst)端口号和IP首部中的源和目的IP地址,则标识互联网上的唯一进程,所以套接字的定义说白了就是IP地址和端口号共同组成。
2).确认序号,4个字节,上一个字段的序号是对数据的编号,所以确认序号是下一个期望接收的TCP分段号,相当于是对对方所发送的并且已经被本方所正确接受的分段的确认。仅当ACK标志为1时有效。确认号表示期望收到的下一个字节的序号。
对Ack的理解:ack表示期望下次接收到的序号。
那么ack是如何算出来的呢,就是通过收到的序号,和数据长度相加得来。假设A收到B过来的数据(seq = 5,len = 15)。len表示数据长度。那么A就会回复B,“刚才的数据我已经收到了,你接下来就发序号为20的包给我吧”。这样就保证了数据不会乱序。
3).序号,4个字节,表示在这个报文段中的第一个数据字节序号。如果将字节流看作在两个应用程序间的单向流动,则TCP用序列号对每个字节进行计数。用来保证到达数据顺序的编号,所以这个字段需要比较大的存储。
4).4位的报头长度,以32位(4字节)字长为单位,需要这个值是因为任选字段的长度是可变的。跟IP头部一样,以4字节为单位。最大是60个字节。不存在任选字段正常的报头长度是20字节。其实相当于给出数据在数据段中的开始位置。
5).保留位,6位,必须为0
6).标志位,占有6个比特位,他们中可以有多个为置为1,依次为:URG,ACK,PSH,RST,SYN,FIN。
下面具体分析:
URG:该位为1说明表示TCP包的紧急指针域有效,用来保证TCP连接不被中断,并督促上层应用敢快处理这些数据。
ACK:确认号有效。
PSH:接收方应尽快将这个报文交给应用层,叫做push。所谓Push操作就是指在数据包到达接收端以后,立即传送给应用程序,而不是在缓冲区中排队。
RST:连接复位,复位因主机奔溃或其他原因而出现的错误连接,也可以用于拒绝非法的分段或拒绝连接请求,这个用处还是比较多的。
SYN:是一个同步序号,通常与ACK合用用来建立连接。也就是常说的三次握手。
FIN:既然有建立连接那么必然有拆除连接,这个字段表示发送端已经达到数据末尾,也就是说双方的数据传送完成,没有数据可以传送了,发送FIN标志位的TCP数据包后,连接将被断开。这个标志的数据包也经常被用于进行端口扫描。
TCP如何发送数据
发送方会先将产生的数据放到发送缓冲区中,然后发送的时候会从发送缓冲区中去取,接收方会将接收到的数据先放到接收缓冲区中,然后应用程序使用的时候会从接收缓冲区中去拿。
网络拥塞:
计算机网络中的带宽、交换结点中的缓存和处理机等,都是网络的资源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏。这种情况就叫做拥塞。
拥塞控制就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制是一个全局性的过程,和流量控制不同,流量控制指点对点通信量的控制。
拥塞避免的算法
快重传
TCP三次握手:
建立链接的时候 有一个计时器3
(1)第一次握手:
客户端将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给服务器端,客户端进入SYN_SENT状态,等待服务器端确认。
(2)第二次握手:
服务器端收到数据包后由标志位SYN=1知道客户端请求建立连接,服务器端将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给客户端以确认连接请求,服务器端进入SYN_RCVD状态。
(3)第三次握手:
客户端收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给服务器端,服务器端检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,客户端和服务器端进入ESTABLISHED状态,完成三次握手,随后客户端与服务器端之间可以开始传输数据了。
为什么是三次握手?