运输层的两个协议:

TCP

transmission control protocol 将要传输的文件分段 传输 建立会话 可靠传输 流量控制

UDP

user data protocol 一个数据包就能完成数据通信 不分段 不建立会话 不需要流量控制 不可靠传输
和DNS服务器通讯就是使用的UDP协议

常见应用层协议使用的端口:

http TCP 80
https TCP 443
RDP TCP 3389
FTP TCP 21
共享文件夹 TCP 445
SMTP TCP 25
POP3 TCP 110
telnet TCP23
SQL TCP 1433
DNS UDP 53(也可以用TCP)

服务和应用层协议之间的关系:

服务使用TCP或UDP的端口侦听客户端请求
客户端使用IP地址定位服务器 使用目标端口 定位服务
可以在服务器网卡上设置只开放必要的端口 实现服务器网络安全

传输层功能

为相互通信的应用程序进程提供逻辑端到端的通信(网络层是为主机之间提供逻辑通信)
传输层还要对收到的报文进行差错检测
传输层提供面向连接和无连接的服务

TCP的端口

端口用一个16位端口号进行标志。
__端口号只具有本地意义__,即端口号只为了标志计算机应用层中的各进程,在因特网中不同计算机的相同端口号没有联系。
端口0-65535
知名端口0-1023
登记端口1024-49151
客户端端口49152-65535

UDP的主要特点

UDP是无连接的,即发送数据之前不需要建立连接。
UDP使用尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制。
UDP是面向报文的,UDP没有拥塞控制,很适合多媒体通信的要求。
UDP支持一对一,一对多,多对一和多对多的交互通信。
UDP的首部开销小,只有8个字节

UDP数据报


伪首部是用来计算检验和的

TCP 传输控制协议

TCP是面向连接的传输层协议
每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的
TCP可供可靠交付的服务
TCP提供全双工通信
面向字节流

TCP的连接

TCP把连接作为最基本的抽象。
每一条TCP连接有两个端点。
TCP连接的端点不是主机,不是主机的IP地址,不是应用进程,也不是传输层的协议端口,TCP连接的端点叫套接字(socket)。
端口号拼接到IP地址构成了套接字
套接字的表示方式在在点分十进制的IP地址后面写上端口号:套接字 socket=(IP地址:端口号)

::=的含义是定义

可靠传输通过自动重传请求ARQ(AutomaticRepeat reQuest)实现
ARQ重传的请求是自动进行的,接收方不需要请求发送方重传某个出错的分组

信号利用率公式,U为信道利用率 TD为发送数据的时间,RTT为往返时间(roundtrip time)。TA为接受数据的时间

TCP报文段的首部格式

序号 占4字节

需要增加到最大后又回到0,
TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,整个要传送的字节流的起始序号必须在建立连接时设置。首部中的序号字段则是指的本报文段所发送的数据的第一个字节的序号

确认号 占4字节

是期望收到发送方下一个报文段的第一个数据字节的序号,
若确认号=N,则表明:到序号N-1为止所有数据都已正确收到
数据偏移 占4bit,它指出TCP报文段的起始处距离TCP报文段的数据起始处有多远,这个字段实际上是指出TCP报文段的首部长度,
数据偏移的单位是32bit(即以4字节为计算单位)
保留 占6bit,保留为今后使用,目前应置为0

紧急URG(URGent)

当URG置1时,发送应用进程就告诉发送方的TCP有紧急数据要传送,于是发送方TCP就把紧急数据插入到本报文段数据的最前面。例如,已经发送了很长一段时间的程序在远地主机上运行,需要取消该程序的运行,因此用户按下中断命令(Control+C)。如果不使用紧急数据,那么这两个字符将储存在接受TCP的缓存末尾。

确认ACK(ACKnowledgment)

仅当ACK=1时确认号字段才有效,TCP规定,在建立连接后所有传送的报文段都必须把ACK置为1。 请求建立连接时ACK位置为0

推送PSH(PuSH)

当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应,在这种情况下,发送方把PSH置为1,并立即创建一个报文段发送出去,接收方在TCP收到PSH为1的报文段后,吉利交付给应用进程,不再等待整个缓存都填满再交付

复位RST(ReSeT)

当TST置为1时,表明TCP出现严重差错(由于主机崩溃或其他原因),必须释放连接,然后重新建立运输连接。

同步SYN(SYNchoronization)

在建立连接时用来同步序号,当SYN为1,ACK为0时,表明这是一个连接请求报文段,若对方同意建立连接,则在响应报文段中使SYN为1,ACK为1。

终止FIN(FINis)

用来释放一个连接,当FIN为1时表明此报文段的发送方数据已发送完毕。

窗口

占2字节,窗口指的是发送本报文段的一方的接受窗口,而不是自己的发送窗口。窗口值告诉对方:从本报文段首部的确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。之所以有这个限制,是因为接收方的数据缓存空间是有限的。总之,窗口值作为接收方让发送方设置其发送窗口的依据。 窗口的含义是:位于发送窗口内的N个分组可以连续发送出去,而不需要等待对方的确认。发送方的发送窗口一定不能超过对方给出的接收方窗口rwnd。
发送方的窗口值上限=Min[rwnd,cwnd]。

以上公式指出
当rwnd<cwnd时,是接收方的接受能力限制发送方窗口的最大值。
当rwnd>cwnd时,则是网络的拥塞程度限制发送方窗口的最大值。
紧急指针 占2字节,紧急指针尽在URG为1时才有意义,它指出本报文段中的紧急数据的字节数,即使窗口为0也可发送紧急数据
最大报文段长度MSS(Maximum Segment Size) MSS是每一个TCP报文段中的数据字段的长度

TCP通讯示例

拥塞控制

拥塞控制指防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不至过载。拥塞控制有一个前提,就是网络能承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有的主机,所有的路由器。相反,流量控制指的是点对点通信量的控制,是个端到端的问题(接收端控制发送端)。流量控制所要做的就是抑制发送端发送数据的速率,以便接收端来得及接受。

TCP的拥塞控制方法

TCP进行拥塞控制的算法有四种

  • 慢开始(slow-start)
  • 拥塞避免(congestion avoidance)
  • 快重传(fast retransmit)
  • 快恢复(fast recovery)

拥塞控制过程图解:

拥塞窗口(congestion window):
拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化,发送方让自己的发送窗口等于拥塞窗口。
慢开始算法的思路:当主机开始发送数据时,由于并不清楚网络的负荷情况,所以如果立即把大量数据字节注入网络,那么就有可能引起网络拥塞,经验证明,较好的方法是先探测一下,既由小到大逐渐增大发送窗口,也就是说,由小到大逐渐增大拥塞窗口数值。使用慢开始算法后,每经过一个传播轮次(transmission round),拥塞窗口(cwnd)就加倍,当网络发生拥塞后,发送方调整门限值ssthresh=cwnd/2,并将拥塞窗口cwnd重新设置为1

拥塞避免算法

拥塞避免算法的思路是让拥塞窗口cwnd缓慢的增大,每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是像慢开始阶段那样加倍增长,当门限值ssthresh=拥塞窗口cwnd时,改为执行拥塞避免算法,拥塞窗口按线性增长。

快重传算法

有时,个别报文段会在网络中丢失,但实际上网络并未发送拥塞。如果发送方迟迟收不到确认,就会产生超时,误认为网络发生了拥塞。这就导致发送方错误地启动慢开始,把拥塞窗口cwnd又设置为1,降低了传输效率。
使用快重传算法可以让发送方尽早地知道发生了个别报文段的丢失,快重传算法首先要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认,即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认。快重传算法规定,只要发送方一连收到3个重复确认,就知道接收方确实没有收到报文段,应当立即进行重传。如果网络发生拥塞,是不可能一连收到3个重复确认的。

快恢复算法

当发送方确认只是丢失个别报文段时,于是不启动慢开始算法,而是执行快恢复算法。这时,发送方调整门限值ssthresh=cwnd/2,同时设置新的拥塞窗口cwnd=ssthresh,并执行拥塞避免算法
TCP的运输连接管理:
三次报文握手示意图:

A在打算建立TCP连接时,向B发送请求报文,TCP规定,SYN报文段(既SYN=1的报文段)不能携带数据,同时选择一个初始序号seq=x,但要消耗一个序号。这时,TCP客户进程进入 (同步已发送)状态。

B在收到连接请求报文段后,如同意建立连接,则向A发送确认。在确认报文段中应把SYN和ACK都置为1,确认号是ack=x+1,同时也为自己选择一个初始序号seq=y。这个报文段也不能携带数据,同时要消耗一个序号,这时TCP服务器进程进入SYN-RCVD(同步收到 synchronous received)状态。

TCP的客户进程在收到B的确认后,还要向B发送确认。确认报文段的ACK置为1,确认号ack=y+1,而自己的序号为seq=x+1。TCP的标准规定,ACK报文段可以携带数据,但如果不携带数据则不消耗序列号,在这种情况下,下一个数据报文段的序号仍是seq=x+1,这时,TCP的连接已经建立,A进入ESTABLISHED状态。当B在收到A的确认后,也进入ESTABLISHED状态。

以上建立连接的过程叫做三报文握手(也称为三次握手).
最后A还要确认一次是防止已失效的连接请求报文段突然又传到了B,假设一个请求报文段等待了很长时间才到达B,此时B误认为A再次请求建立连接,会对B造成资源浪费。
TCP的连接释放:

TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
A在TIME-WAIT状态等待2MSL时间的理由:
为了保证A发送的最后一个ACK报文段能够到达B。这个ACK报文段有可能丢失,因而使处在LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认。B会超时重传这个FIN+ACK报文段。而A就能在2MSL时间内收到这个重传的FIN+ACK报文段。如果A在TIME-WAIT状态不等待一段时间,而是在发送完ACK报文段后立即释放连接,那么就无法收到B重传的FIN+ACK报文段,因而也不会再发送一次确认报文段,这样,B就无法按照正常步骤进入CLOSED状态。