tcp详解
TCP使用固定的连接
TCP用于应用程序之间的通信
IP负责计算之间的通信
TCP负责把数据分割并装入IP包,然后他们到达的时候重新组合他们。
IP负责将包发送至接收者。
TCP报文格式
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之间可以进行传输数据。
SYN攻击
四次挥手
第一次挥手: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状态,完成四次挥手。
对于交互性要求较高的应用
捎带ACK的发送方式
当主机收到远程主机的TCP数据报之后,通常不马上发送ACK数据报,而是等上一个短暂的时间,如果这段时间里主机还有发送到远程主机的TCP数据报,那么马上把这个ACK数据报“捎带”着发送出来,把本来两个TCP数据报整合成一个发送。一般的,这个时间是200ms。
Nagle算法
当主机A给主机B发送了一个TCP数据报并进入等待主机B的ACK数据报的状态时,TCP的输出缓冲区里面只能有一个TCP数据报,并且,这个数据报不断收集后来的数据,整合成一个大的数据报,等到B主机的ACK包一到,就把这些数据全部发送出去,
滑动窗口
滑动窗口本质上是描述接受方的TCP数据报缓冲区大小的数据,发送方根据这个数据来计算自己最多能够发送多长的数据。如果发送方收到接收方的窗口大小为0的TCO数据报,那么发送方将停止发送数据,等到接收方发送窗口大小不为0的数据报的到来。
TCP就是利用这个窗口,慢慢的从数据的左边移动到右边,把处于窗口范围内的数据发送出去(只有窗口内的数据可以发送)。
作用:
- 提供TCP的可靠性
- 提供TCP的流控特性
基本原理:
- 对于tcp会话的发送方,任何时候在其发送缓存区的数据都可以分为4类,“已经发送并得到对端ACK的”,“已经发送但还未到收到对端ack的”,“未发送但对端允许发送的”,“未发送且对端不允许发送”。“已经发送但还未收到对端ACK的”和“未发送但对端允许发送的”这两部分数据称之为发送窗口。
当收到接收方新的ACK对于发送窗口后续字节的确认时,窗口滑动。 - 对于TCP的接收方,在某一时刻在他的接受缓存内存在三种。“已接收”,“未接收准备接受”,“未接收并为准备接受”(由于ACK直接向TCP协议栈回复,默认无应用延迟,不存在“已接收回复ACK”)。其中,“未接收准备接收”称之为接收窗口。
发送窗口与接收窗口关系
TCP是双工的协议,会话的双方都可以同时接收、发送数据。TCP会话的双方都各自维护一个“发送窗口”和一个“接收窗口”。其中各自的“接收窗口”大小取决于应用、系统、硬件的限制。各自的发送窗口则取决于对端的“接受窗口”。
滑动窗口实现面向流的可靠性
最基本的传输可靠性来源于“确认重传”机制。
TCP的滑动窗口的可靠性也是建立在“确认重传”基础上的。
发送窗口只有收到对端对于本段发送窗口的ACK确认时,才会移动到发送窗口的左边界。
接受窗口只有在前面所有的段都确认的情况下才会移动左边界,挡在前面还有字节未接收但收到后面字节的情况下,窗口不会移动,并不对后续字节确认。以此确保对端会对这些数据重传。
滑动窗口的流控特性
TCP的滑动窗口是动态的,应用根据自身的处理能力变化,通过本端TCP接收窗口大小控制来对对端的发送窗口流量控制。
应用程序在需要(如内存不足)时,通过API通知TCP协议栈缩小TCP的接收窗口。然后TCP协议栈在下个段发送时包含新的窗口大小通知给对端,对端通知的窗口来改变发送窗口,以此来到达缓减发送速率的目的。
窗口的简单定义
- 窗口左边向右边靠近为窗口合拢。这种现象发生在数据发送和确认时。
- 当窗口右边沿向右移动时将允许发送更多的数据,称之为窗口张开。这种现象发生在另一端的接受进程读取已经确认的数据并释放了TCP的接受缓存时。发生在接收端处理了数据之后。
- 当右边窗口左移时,称之为窗口收缩。不常发生。
发送方打开几号窗口表示发送方已经发送了该序列的帧,但是如果没有得到接收方ACK确认的话,此时该序列的帧仍然在发送窗口中。接收方打开几号窗口代表接收端收到几号的帧,但是并没有返回ack确认。当接收方返回该序号的ack时,该序号关闭(合拢),接收方收到ack时,该序号窗口关闭。
数据拥塞
TCP发送方首先传送一个数据报,然后等待对方的回应,得到回应后就把这个窗口的大小加倍,然后连续发送两个数据报,等到对方的回应后。再把这个窗口加倍(显示2的质数倍,到一定程度后就变成现行增长,就是所谓的慢启动),发送更多的数据报,回到出现超时错误,这样,发送端就到了了解通信双方的线路承载能力,也就是确定了拥塞窗口的大小,发送方就用这个拥塞窗口的大小发送数据。
tcp与udp的区别
- TCP面向连接,udp是无连接的,即发送数据之前是不需要建立连接的
- TCP提供可靠地服务,也就是说,通过TCP连接传送的数据无差错,不丢失,不重复,且按序到达,UDP尽最大努力交付。
- TCP面向字节流,实际是TCP把数据看成一连串无结构的字节流,UDP是面向报文的,UDP没有拥塞控制
- TCP连接是点对点的,UDP支持一对一,一对多,多对一,多对多的交互通信。
- TCP首部开销20字节,UDP8个字节。
- TCP的逻辑信道是全双工的可靠信道,UDP是不可靠信道。
p.s.图片来源于网络。侵删。