TCP用于应用程序之间的通信
IP负责计算之间的通信
TCP负责把数据分割并装入IP包,然后他们到达的时候重新组合他们。
IP负责将包发送至接收者。
URG:紧急标志。紧急标志位“1”标明该位有效。
ACK:确认标志。标明确认编号栏有效。大多数情况下默认该标志位是置位的。TCP报头内的确认编号栏内包含的确认编号(w+1)为下一个预期的序列编号,同时提示远端系统已经成功接收所有数据。
PSH:推标志。该标志置位时,接收端不该将数据进行队列处理,而是尽可能块的将数据转由应用处理。
RST:复位标志。用于复位相应的TCP连接。
SYN:同步标志。表明同步序列编号栏有效。该标志仅在三次握手建立TCP连接时有效。它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。
FIN:结束标志。
第一次握手:Client将标志位置为1,随机产生一个seq=J,并将改数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
第二次握手:Server收到数据包后将标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个seq=K,并将数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确将标志位ACK置为1,ack=K+1,并将数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client和Server之间可以进行传输数据。
第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态
第二次挥手:Server收到FIN后,发送一个ACK到Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态
第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
当主机收到远程主机的TCP数据报之后,通常不马上发送ACK数据报,而是等上一个短暂的时间,如果这段时间里主机还有发送到远程主机的TCP数据报,那么马上把这个ACK数据报“捎带”着发送出来,把本来两个TCP数据报整合成一个发送。一般的,这个时间是200ms。
当主机A给主机B发送了一个TCP数据报并进入等待主机B的ACK数据报的状态时,TCP的输出缓冲区里面只能有一个TCP数据报,并且,这个数据报不断收集后来的数据,整合成一个大的数据报,等到B主机的ACK包一到,就把这些数据全部发送出去,
滑动窗口本质上是描述接受方的TCP数据报缓冲区大小的数据,发送方根据这个数据来计算自己最多能够发送多长的数据。如果发送方收到接收方的窗口大小为0的TCO数据报,那么发送方将停止发送数据,等到接收方发送窗口大小不为0的数据报的到来。
TCP就是利用这个窗口,慢慢的从数据的左边移动到右边,把处于窗口范围内的数据发送出去(只有窗口内的数据可以发送)。
作用:
基本原理:
TCP是双工的协议,会话的双方都可以同时接收、发送数据。TCP会话的双方都各自维护一个“发送窗口”和一个“接收窗口”。其中各自的“接收窗口”大小取决于应用、系统、硬件的限制。各自的发送窗口则取决于对端的“接受窗口”。
最基本的传输可靠性来源于“确认重传”机制。
TCP的滑动窗口的可靠性也是建立在“确认重传”基础上的。
发送窗口只有收到对端对于本段发送窗口的ACK确认时,才会移动到发送窗口的左边界。
接受窗口只有在前面所有的段都确认的情况下才会移动左边界,挡在前面还有字节未接收但收到后面字节的情况下,窗口不会移动,并不对后续字节确认。以此确保对端会对这些数据重传。
TCP的滑动窗口是动态的,应用根据自身的处理能力变化,通过本端TCP接收窗口大小控制来对对端的发送窗口流量控制。
应用程序在需要(如内存不足)时,通过API通知TCP协议栈缩小TCP的接收窗口。然后TCP协议栈在下个段发送时包含新的窗口大小通知给对端,对端通知的窗口来改变发送窗口,以此来到达缓减发送速率的目的。
发送方打开几号窗口表示发送方已经发送了该序列的帧,但是如果没有得到接收方ACK确认的话,此时该序列的帧仍然在发送窗口中。接收方打开几号窗口代表接收端收到几号的帧,但是并没有返回ack确认。当接收方返回该序号的ack时,该序号关闭(合拢),接收方收到ack时,该序号窗口关闭。
TCP发送方首先传送一个数据报,然后等待对方的回应,得到回应后就把这个窗口的大小加倍,然后连续发送两个数据报,等到对方的回应后。再把这个窗口加倍(显示2的质数倍,到一定程度后就变成现行增长,就是所谓的慢启动),发送更多的数据报,回到出现超时错误,这样,发送端就到了了解通信双方的线路承载能力,也就是确定了拥塞窗口的大小,发送方就用这个拥塞窗口的大小发送数据。