计算机网络(三)传输层—TCP

时间:2022-12-23 14:34:09

传输层

传输单位是TCP报文段或UDP数据报,任务是负责两个进程(端口)之间的通信(端到端);复用是发送方不同的进程可以使用同一传输层协议传输数据,分用是接收方在传输层剥去报文首部可以将这些数据正确交付目的应用进程;传输层对整个报文进行差错检测。

3.1端口

    端口标识主机中的应用程序,进程数据通过端口向下交付给传输层,端口号长度为16bit,可以标识65536个不同的端口号,端口号只具有本地意义!

    结合端口,网络中使用发送和接受方的套接字socket(主机IP+端口号)组合来标识端点

3.2TCP

尽管下层的网络不可靠,但可以加入一些逻辑使其可靠,面向连接的tcp向上提供一条全双工的可靠信道,在传送数据前需要先建立连接,在数据传送结束后释放连接,为了可靠传输,TCP加入了如确认、流量控制、计时器和拥塞控制等,不仅使tcp头部大,占用的处理机资源也会多,时期主要适用于更可靠和更重要的场合如文件传输协议FTP,超文本传输协议HTTP和远程登录TELENT等。

tcp保证传输的可靠、有序、无丢失和不重复,特点是:

(1)面向连接(每条tcp连接只能是一端到一端);

(2)全双工允许双方任意发送数据,发送方的缓存临时存放tcp准备发送和tcp已发送但未确认的数据,接收方则缓存按序到达但未读取的数据和未按序到达的数据);

(3)面向字节流,虽然应用程序交给tcp固定或者不固定的数据块,但tcp仅将它们视为无结构的字节流。

    计算机网络(三)传输层—TCP

tcp报头最短需要为20字节:

序号字段是报文数据的第一个字节的序号(tcp给每个字节都编了序号);

确认号则是期待收到的下一个报文段的数据的第一个字节的序号(若确认号=N,则N-1已正确接受);

确认位ACKTCP建立连接后都会置为1,表示确认号字段有效;

复位位RST=1意味着tcp连接出错(主机崩溃等),必须释放连接然后重新尝试建立连接;

同步位SYN=1&&ACK=0)表示这是一个连接请求,而对方的响应报文如果为(SYN=1ACK=1)则意味着同意建立连接;

终止位FIN=1请求释放连接;

窗口大小指出限制发送缓存空间有限,发送方最多能发送的数据量(如确认号700,窗口大小1000,则意味着发送端能发送701~1700的数据),

选项字段基本上就是最大报文段长度MSS,指出TCP报文段中数据字段的最大长度。

 

MSS的大小并非考虑接收方缓存放不下TCP报文段,其与接收窗口木有关系,TCP首部+IP首部至少40字节,加上链路层的开销,若MSS过小,网络利用率太低,但若MSS过大,IP层可能会分解为多个数据报片,接收端需要合并,且传输出现差错时,还需要重传。所以MSS需要尽量大但不使IP分片,但IP数据报经过的路径动态变化,最佳MSS很难确定,议案默认为MSS=536

3.2.1三次握手

 计算机网络(三)传输层—TCP

步骤:

(1)客户端的TCP首先向服务端的TCP发送一个连接请求报文段,携带SYN=1seq = x(随机序列号) --连接请求报文不携带数据,但要消耗一个序号

(2)当服务端收到客户端发出的请求报文段后,若同意建立连接,则向客户端发回确认,并给TCP连接分配TCP缓存和变量SYN=1ACK=1,(确认号)ack=x+1seq=y(起始序号--随机产生)---不携带数据,但也消耗一个随机序号

(3)当客户端收到服务端的确认连接时,向服务器再次发送确认 ACK=1 seq=x+1,确认号ack=y+1给连接分配缓存和变量,可以携带数据报

全双工通信:通信双方的应用进程在任何时候都能发送数据。


注意1:为何不使用两次握手?

AB的连接请求1如果长时间滞留在网络中导致A重发请求2建立了连接2并且在传输完数据和释放连接2后(假设释放不等待2MSL,这也是等待的2MSL原因),滞留的请求1到达B,就会建立连接1,一直等待A传输数据。而三次握手,B需要返回确认报文段,A会无视该报文段,连接便建立失败。

注意2:为何序号随机?

考虑AB频繁的建立和释放连接,那肯定不能释放时都等2MSL时间,那么A在第n次连接时发的一些报文可能会滞留的比较久,当ABn+x次连接建立时该数据到达,则可能会因为序号在新连接的接收范围内而被接收。所以新的TCP连接的初始序号一定与其之前连接使用过的序号不一样

3.2.2四次挥手

 计算机网络(三)传输层—TCP

步骤:

1)客户端要关闭连接,则发送连接释放报文段并停止再发送数据FIN=1seq=u,(u等于前面已传送过的数据的最后一个字节的序号加1)。TCP是全双工的,一条TCP连接上两条数据通路,当发送FIN报文时,发送FIN的一端就不能再发送数据,关闭其中一条数据通路,但对方还可以发送数据。

(2)服务器收到连接释放报文段发出确认,确认号ACK=1,ack=u+1,随机序列号seq=v。此时客户端到服务器这个方向就释放了,处于半关闭状态。但服务器若发送数据,客户机仍要接收,因为服务器到客户机这个方向的连接并未关闭。

(3)若服务器没有要想客户端发送的数据,通知TCP释放连接,FIN=1ACK=1 seq=w,ack=u+1

(4)客户端收到连接释放报文段后,必须发出确认。ACK=1ack=w+1,seq=u+1。此时TCP连接还没有释放掉,必须经过时间等待计时器设置时间为2MSL后,客户端才关闭。

注:为什么要经过2MSL时间?

1、确保客户端发送的最后一个确认报文段可以到达服务端,当确认报文段发生超时,需要客户端重传,在2MSL时间内被服务端接收。

2、防止在此期间,一些报文段仍在网络中生存,彻底关闭后,如果有一个socket四元组重新建立连接,这些垃圾报文段就会错误的被新连接接收,等待2MSL可以使滞留在网络中的垃圾报文段彻底消失。

连接和释放注意三个问题:

1)要使每一方能够确知对方的存在

2)要允许双方协商一些参数(如最大报文段长度,最大窗口大小,服务质量等)

3)能够对运输实体资源(如缓存大小,连接表中的项目等)进行分配


3.2.3TCP可靠传输

序号字段和确认字段+重传保证可靠,重传在超时和冗余ACK的情况下会发生

超时:TCP发送报文段会设置该报文段的计时器,并自适应设定重传时间(每个报文段发出和确认的时间差为往返时间差RTTTCP保留RTT的加权平均RTTs作为重传时间)

 

冗余ACK这种情况其实就是拥塞控制的快速重传,因为TCP规定当收到比期待序号大的失序报文段到达时发送冗余ACK指明下一个期待字节的序号,在不等待超时,连续收到3个冗余ACK就认为该确认报文段之后的报文丢失了,立即重传。

http://blog.csdn.net/ns_code/article/details/32707721

快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认(重复发送对前面有序部分的确认),而不是等待自己发送数据时才进行稍待确认,也不是累积收到的报文发送累积确认,如果发送方连续收到三个重复确认,就应该立即重传对方未收到的报文段(有收到重复确认,说明后面的报文段都送达了,只有中间丢失的报文段没送达))

 

在链路层保证可靠的情况下,为何还需要TCP可靠:因为IP不可靠,无序

3.2.4TCP流量控制

跟链路层一样使用滑动窗口,不管TCP接收方的接收窗口rwnd可以根据接收缓存的大小来动态的调整发送方发送窗口的大小swnd,当然,用于拥塞控制的的拥塞窗口cwnd的大小与网络带宽和时延密切相关。(TCP需要维护两个窗口)

AB发数据,B回复确认报文时设置窗口字段(为rwndcwnd的最小值),这样A就根据这个最新的窗口值来控制发送效率。

 计算机网络(三)传输层—TCP

流量控制就是让发送方的发送速率不要太快,让接收方来得及接收。

    对于成块数据流TCP利用滑动窗口机制来实现流量的控制,对于交互数据流TCP利用捎带ACKNagle算法来实现流量的控制。