传输层的功能
传输层为应用进程间提供端到端的逻辑通信(网络层是提供主机之间的逻辑通信),
传输层两大重要的功能:复用 和 分用。
复用:在发送端,多个应用进程公用一个传输层;
分用:在接收端,传输层会根据端口号将数据分派给不同的应用进程。
和网络层的区别:
网络层为不同主机提供通信服务,而传输层为不同主机的不同应用提供通信服务。
网络层只对报文头部进行差错检测,而传输层对整个报文进行差错检测。
传输层两大协议:
UDP(User Datagram Protocol)协议 : 用户数据报协议, 一个数据包就能够完成数据通信,不分段,不需要建立会话,不需要流量控制,不可靠传输,提供多播服务。
TCP(Transmission Control Protocol)协议: 传输控制协议,需要将要传输的文件分段传输;需要建立会话,可靠传输,流量控制,并且TCP不提供广播和多播服务。
UDP协议
UDP的特点
UDP是无连接的 发送数据前不需要建立连接。
UDP是不可靠的 它是尽力而为交付,不能确保每一个数据报都送达。
UDP是面向报文的
UDP数据传输的单位是报文,且不会对数据作任何 拆分 和 拼接 操作。在发送端,应用程序给传输层的UDP什么样的数据,UDP不会对数据进行切分,只增加一个UDP头并交给网络层。在接收端,UDP收到网络层的数据报后,去除IP数据报头部后遍交给应用层,不会作任何拼接操作。
UDP没有拥塞控制
UDP始终以恒定的速率发送数据,并不会根据网络拥塞情况对发送速率作调整。这种方式有利有弊。
弊端:网络拥塞时有些报文可能会丢失,因此UDP不可靠。
优点:有些使用场景允许报文丢失,如:直播、语音通话,但对实时性要求很高,此时UDP还是很有用武之地的。
UDP支持一对一、一对多、多对多、多对一通信,而TCP只支持一对一通信。
UDP首部开销小,只有8字节,而TCP头部至少由20字节,相比于TCP要高效很多。
UDP报文格式
源端口: 在对方回信时选用, 不用就全0.
目的端口: 在重点交付报文时需要.
长度: UDP数据部分的长度.
检验和: 检验UDP报 是否出现差错, 有就丢弃.
要注意的地方
UDP首部中校验和的计算方法有些特殊。在计算校验和时,要在UDP用户数据报之前增加12个字节的伪首部。
伪首部既不向下传送也不向上递交,而仅仅是为了计算校验和。
与IP数据报的校验和只校验IP数据报的首部不同,UDP的校验和是把首部和数据部分一起都校验。接收端进行的校验和与UDP报文中的校验和相与,如果无差错应该全为1。如果有误,则将报文丢弃或者发给应用层、并附上差错警告。
TCP协议
TCP的特点
TCP是面向连接的:通信前需要建立连接,通信结束需要释放连接。
TCP提供可靠交付服务:TCP发送的数据无重复、无丢失、无错误、与发送端顺序一致。
TCP是面向字节流的:它关注的对象不是UDP的报文段, 而是报文里面的字节流, 对字节流进行信息处理。TCP以字节为单位。虽然传输的过程中数据被划分成一个个数据报,但这只是为了方便传输,接收端最终接受到的数据将与发送端的数据一模一样。
TCP提供全双工通信:TCP的两端既可以作为发送端,也可以作为接收端。
一条TCP连接的两端只能有两个端点 : TCP只能提供点到点的通信,而UDP可以任意方式的通信。
TCP连接 与 套接字
TCP连接:TCP连接是一种抽象的概念,表示一条可以通信的链路。每条TCP连接有且仅有两个端点,表示通信的双方。且双发在任意时刻都可以作为发送者和接收者。
套接字: 一条TCP连接的两端就是两个套接字。 套接字=IP地址:端口号。 因此,TCP连接=(套接字1,套接字2)=(IP1:端口号1,IP2:端口号2)
TCP报文格式
TCP头部长度有20字节的固定部分,选项部分长度不定,但最多40字节,因此TCP头部在20-60字节之间。
源端口:源端口和IP地址的作用是标识报文的返回地址
目的端口: 用来标识同一台计算机的不同的应用进程
序号: 本报文段发送的数据组的第一个字节的序号。在TCP传送的流中,每一个字节一个序号。
例如:一个报文段的序号为300,此报文段数据部分共有100字节,则下一个报文段的序号为400。所以序号确保了TCP传输的有序性。
确认号: 即ack,指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。确认号只有当ACK标志为1时才有效。比如建立连接时,SYN报文的ACK标志位为0时无效,1时有效。
数据偏移: 数据偏移也叫首部长度,是因为首部长度实际上指示了数据区在报文段中的起始偏移值。。由于首部可能含有可选项内容,因此TCP报文头的长度是不确定的,报头不包含任何任选字段时长度为20字节,4位首部长度字段所能表示的最大值为1111,转化为10进制为15,15*32/8 = 60,故报头最大长度为60字节。
保留: 为将来定义新的用途保留,现在一般置0。
控制位:URG ACK PSH RST SYN FIN,共6个,每一个标志位表示一个控制功能。
紧急URG: 当URG置为1, 表明紧急指针有效. 当URG=1(有紧急数据时), 此TCP报文就把紧急数据插入到本TCP报文的数据部分的最前面。如control+c:这个命令要求操作系统立即停止当前进程。此时,这条命令就会存放在数据包数据部分的开头,并由紧急指针标识命令的位置,并URG字段被置1
确认ACK: 当ACK=1时, 确认序号字段生效。此外,TCP规定,在连接建立后传送的所有报文段都必须把ACK置1。
推送PSH: 当接收方收到PSH=1的报文后,会立即将数据交付给应用程序,而不会等到缓冲区满后再提交。 一些交互式应用需要这样的功能,降低命令的响应时间。
复位RST: 当RST=1时, 表明TCP连接出现严重差错, 需要释放连接并重新连接。用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。
同步SYN: 用于建立连接过程,SYN在建立连接时使用。 当SYN=1,ACK=0时,表示当前报文段是一个连接请求报文;当SYN=1,ACK=1时,表示当前报文段是一个同意建立连接的应答报文。
终止FIN: 当FIN=1时, 表示此报文段的发送方的数据已经发送完毕, 要求释放连接.
窗口: 该字段用于实现TCP的流量控制。它表示当前接收方的接收窗口的剩余容量,发送方收到该值后会将发送窗口调整成该值的大小。发送窗口的大小又决定了发送速率,所以接收方通过设置该值就可以控制发送放的发送速率。 发送方每收到一个数据报都要调整当前的发送窗口。窗口大小时一个16bit字段,因而窗口大小最大为65535。
校验和: 奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证。
紧急指针: 只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。
选项和填充:最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。
数据部分: TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。