UDP协议
用户数据报协议UDP概述
UDP只在IP数据报服务之上增加了很少功能,即复用分用和差错检测功能
UDP的主要特点:
-
UDP是无连接的,减少开销和发送数据之前的时延
-
UDP使用最大努力交付,即不保证可靠交付,可靠性由UDP上层即应用层保证
-
UDP是**面向报文(面向应用层的报文,直接交付给下一层)**的,适合一次性传输少量数据的网络应用
因此应用程序需要选择大小合适的报文,报文太长则网络层需要分片以满足链路层MTU的要求,这样就会降低网络层的效率
4.UDP无拥塞控制,适合实时应用(比如IP电话、视频会议)
5.UDP首部开销小,只有8B,TCP20B
UDP首部格式
一定会有首部字段,数据字段可以为0
16位源端口号可有可无。如果期望收到对方的回复则添上,如果不需要就可以是全0。目的端口号一定要有16位UDP长度单位是1B
各字段意义如下:
- 源端口。源端口号。在需要对方回信时选用,不需要时可用全0。
- 目的端口。目的端口号。这在终点交付报文时必须使用到。
- 长度。UDP数据报的长度(包括首部和数据),其最小值是8 (仅有首部)。
- 校验和。检测UDP数据报在传输中是否有错。有错就丢弃。该字段是可选的,当源主机不想计算校验和时,则直接令该字段为全0。
UDP校验
17就是IP数据报首部的协议字段,这个协议字段说明IP数据报数据部分使用什么协议,这里数据部分使用UDP协议,对应的协议字段值是17
- 伪首部和全0字节是不发送的,仅供校验使用
TCP协议
TCP协议特点和TCP报文段
TCP主要特点
1.TCP是**面向连接(虚连接)**的传输层协议
虚连接 ------ 并不是实际的物理连接,只是使用时就好像两个进程之间直接建立了点对点的连接。实际上连接过程是把数据报加上各个层次的首部之后放到链路上传输,然后在接收端进行步步解封装,这是一个完整的物理连接
2.每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的
TCP协议不能用于广播和多播通信方式
3.提供可靠交付的服务,无差错、不丢失、不重复、按序到达。可靠有序,不丢不重
4.提供全双工通信
发送方和接收方角色不定,双方可以同时发送数据也可以同时接收数据
TCP协议连接的两端都会设置发送缓存,接收缓存发送缓存:应用层准备发送的数据&已发送但尚未收到确认的数据
接收缓存:按序到达但尚未被应用程序读取的数据&不按序到达的数据
5.TCP面向字节流
流:流入到进程或从进程流出的字节序列
虽然进程和TCP交互时一次发送一个数据块,数据块可能大小不一样,但TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流发送方发送文件时会把文件按照字节排序编号并放入TCP缓存,再取几个字节加上TCP头形成TCP报文段再放到链路上传输
TCP报文段首部格式
以上图为例发送"123"报文段时,该报文段首部序号字段填1
接收端已经收到了"123"报文段就会给发送端发送首部确认号字段为4的报文段
由数据偏移字段可知首部最大为60B
将RST置为1还可以用来拒绝一个非法报文段,或者拒绝打开一个链接
同步位SYN
。同步SYN= 1表示这是一个连接请求或连接接收报文
。当SYN=1, ACK=0
时,表明这是一个连接请求
报文,对方若同意建立连接,则在响应报文中使用SYN=1, ACK=1
。即SYN= 1表示这是一个连接请求或连接接收报文。
校验和
。占2B。校验和字段检验的范围包括首部和数据两部分。在计算校验和时,和UDP一样,要在TCP报文段的前面加上12B的伪首部(只需将UDP伪首部的第4个字段,即协议字段的17改成6,其他的和UDP一样)。
窗口字段。占2B。它指出现在允许对方发送的数据量,接收方的数据缓存空间是有限的,因此用窗口值作为接收方让发送方设置其发送窗口的依据,单位为字节。例如,假设确认号是701,窗口字段是1000。这表明,从701号算起,发送此报文段的接收方方还有接收1000B数据(字节序号为701 ~1700)的接收缓存空间。
紧急指针指出紧急数据的末位在报文段当中的位置。如紧急指针值为50,则TCP数据部分的前50个字节均为紧急数据,剩下的为普通数据
选项字段
。长度可变。TCP最初只规定了一种选项,即最大报文段长度(Maximum SegmentSize,MSS)。MSS是TCP报文段中的数据字段的最大长度。窗口扩大、时间戳、选择确认
填充字段
。这是为了使整个首部长度是4B的整数倍。填充0.
TCP连接管理
TCP连接管理
TCP连接传输分为三个阶段:
TCP连接的建立采用客户服务器方式,主动发起连接建立的应用进程叫做客户,而被动等待连接建立的应用进程叫服务器。
TCP的连接建立
三次握手
- seq为序号字段,标明本次报文段数据部分的第一个字节的序号
- ack是
确认号字段
,告诉对方我接下来应该接收的数据是从字节序号ack开始的数据 - ACK是确认位,0时
确认号字段ack
无效,1时确认号字段ack
有效 - SYN是同步位
- 第一步:客户机的TCP首先向服务器的TCP发送一个连接请求报文段。这个特殊的报文段中不含应用层数据,其首部中的SYN标志位被置为1。另外,客户机会随机选择一个起始序号 seq= x(连接请求报文不携带数据,但要消耗一个序号)。
- 第二步:服务器的TCP收到连接请求报文段后,如同意建立连接,就向客户机发回确认,并为该TCP连接分配TCP缓存和变量。在确认报文段中,SYN和ACK位都被置为1,确认号字段的值为x+ 1, 并且服务器随机产生起始序号seq = y(确认报文不携带数据,但也要消耗-一个序号)。确认报文段同样不包含应用层数据。
- 第三步:当客户机收到确认报文段后,还要向服务器给出确认,并且也要给该连接分配缓存和变量。这个报文段的ACK标志位被置1,序号字段为x+1,确认号字段ack=y+ 1。该报文段可以携带数据,若不携带数据则不消耗序号。成功进行以上三步后,就建立了TCP连接,接下来就可以传送应用层数据。
TCP提供的是全双工通信,因此通信双方的应用进程在任何时候都能发送数据。
- 服务器端的资源是在完成第二次握手时分配的
- 而客户端的资源是在完成第三次握手时分配的,这就使得服务器易于受到SYN洪泛攻击。
SYN洪泛攻击
解决方案:SYN cookie
TCP的连接释放
四次挥手
- 第一步:客户机打算关闭连接时,向其TCP发送一个连接释放报文段, 并停止发送数据,主动关闭TCP连接,该报文段的FIN标志位被置1, seq=u, 它等于前面已传送过的数据的最后一个字节的序号加1 (FIN报文段即使不携带数据,也要消耗一个序号)。TCP 是全双工的,即可以想象为一条TCP连接上有两条数据通路。发送FIN报文时,发送FIN的一端不能再发送数据,即关闭了其中一条数据通路,但对方还可以发送数据。
- 第二步:服务器收到连接释放报文段后即发出确认,确认号是ack=u+ 1,而这个报文段自己的序号是v,等于它前面已传送过的数据的最后一个字节的序号加1。此时,从客户机到服务器这个方向的连接就释放了,TCP连接处于半关闭状态。但服务器若发送数据,客户机仍要接收,即从服务器到客户机这个方向的连接并未关闭。
- 第三步:若服务器已经没有要向客户机发送的数据,就通知TCP释放连接,此时其发出FIN= 1的连接释放报文段。
- 第四步:客户机收到连接释放报文段后,必须发出确认。在确认报文段中,ACK字段被置为1,确认号ack=w+1,序号seq=u+1.此时TCP连接还未释放,必须经过时间等待计时器设置的时间2MSL后,A才进入连接关闭状态。
TCP连接建立和释放的总结如下
- 1)连接建立。分为3步:
①SYN=1,seq=x。
②SYN=1, ACK=1, seq=y, ack=x+ 1。
③ACK=1,seq=x+1, ack=y+ 1。
- 2)释放连接。分为4步:
①FIN=1, seq= u
②ACK=1, seq=v, ack=u+ 1。
③FIN=1,ACK=1, seq=w,ack=u+ 1。
④ACK=1, seq=u+1, ack=w+ 1。
关于连接和释放,ACK、 SYN、 FIN 一定等于1
TCP可靠传输
TCP可靠传输
序号
TCP协议面向字节流,因此TCP传输时以字节为单位,对字节依次编号。实际发送会把多个字节放在一起组成报文段发送,报文段大小不定,取决于链路层MTU
对于文件或者要发送的数据,第一个字节的序号可以是随机的
确认
发送方在收到对发送报文段的确认之前,TCP缓存区应保留报文段
接收方此时收到了"123"报文段,就会发送一个首部确认号字段为4的确认报文段,在发送方收到后把TCP缓存中的"123"报文段删去
接收方可在合适时候发送确认报文段,也可在要发送数据时把确认信息捎带上,即捎带确认
接收方采用累计确认,只确认数据流当中至第一个丢失字节为止的字节
假如发送端此时发送了"456"和"78"两个报文段,但接收端只接收到了"78"报文段,接收端还是会一直发送确认号为4的报文段。在收到确认号为4的报文后,发送端会重传"456"报文段。在接收端收到"456"报文段后,下次发送的确认号应为9
重传
TCP协议也有发送窗口和接收窗口的概念,在发送过程中会使用GBN协议和SR协议,使用时同链路层讲过的大同小异
TCP流量控制
TCP拥塞控制
TCP拥塞控制
拥塞控制是全局性问题,接收方并不知道拥塞情况具体是哪几台主机发送数据过多造成的。而流量控制是点到点之间的问题,接收方知道找哪个发送方
拥塞控制四种算法
慢开始和拥塞避免
cwnd=n表示为n个报文段,长度都为MSS
慢开始cwnd翻倍在收到之前发送报文的确认后立刻发生