一、传输层提供的服务
1.传输层
中间的网络设备最多只能到网络层
进程和进程之间的逻辑通信------ 表面上是两个主机的进程之间在通信。但实际是把数据从上层进行步步封装传给物理层,物理层放到链路上传输,到对端再至下而上把数据解封装交付给上层
复用 :发送方 不同的应用进程可以使用同一个传输层协议 来传输数据 传输层--->网络层分用 :接收方 在传输层去掉报文首部后能够把数据送交给正确的进程 网络层--->传输层
网络层的首部校验和只校验IP数据报头部没有校验数据部分,需要高层实现对数据的检错。网络层的数据部分就是传输层的报文段,因此传输层如果对报文进行差错检测,那网络层就不需要再对报文进行差错检测。网络层+传输层可以实现可靠传输传输层并不一定会实现可靠传输(UDP)
2.传输层的两个协议
方便起见可将两个协议的传输单元都称为报文段
QQ发送一条消息即使用UDP协议
3.传输层寻址与端口
如果要发送数据给一台主机,在网络当中根据其IP地址寻找到它所在的网络,进入它所在的网络后再根据MAC地址再定位到具体的主机。找到主机后还应根据端口交付给具体的应用进程
端口:逻辑端口/软件端口,是传输层的SAP,标识主机中的应用进程
路由器和交换机上那种可以直接插拔的端口叫做硬件端口。而传输层的端口是看不见摸不着的,所以叫软件端口
用端口号来标识端口,端口号只有本地意义,在因特网中不同计算机的相同端口没有联系
端口号长度为16bit,可以表示2^16 = 65536个不同的端口号
客户端使用的端口号只有在使用时才会由操作系统随机分配,进程结束就会端口号被回收
一些常用的端口号:
在网络中采用发送方和接收方的套接字组合来识别端点,套接字唯一标识了网络中的一个主机和它上面的一个进程。
套接字Socket= (主机IP地址, 端口号)
二、UDP协议
1.用户数据报协议UDP概述
UDP只在IP数据报服务之上增加了很少功能,即复用分用和差错检测功能
注意!!!!!!!!!!!!!!!!!!:
UDP的主要特点:
-
UDP是无连接的,减少开销和发送数据之前的时延
-
UDP使用最大努力交付,即不保证可靠交付,可靠性由UDP上层即应用层保证
-
UDP是面向报文的,适合一次性传输少量数据的网络应用
因此应用程序需要选择大小合适的报文,报文太长则网络层需要分片以满足链路层MTU的要求,这样就会降低网络层的效率
-
UDP无拥塞控制,适合实时应用(比如IP电话、视频会议)
-
UDP首部开销小,只有8B,TCP20B
2.UDP首部格式
一定会有首部字段,数据字段可以为0
16位源端口号可有可无。如果期望收到对方的回复则添上,如果不需要就可以是全0。目的端口号一定要有16位UDP长度单位是1B
3.UDP校验
17就是IP数据报首部的协议字段,这个协议字段说明IP数据报数据部分使用什么协议,这里数据部分使用UDP协议,对应的协议字段值是17
三、TCP协议
1.TCP协议特点和TCP报文段
1)TCP主要特点
-
TCP是面向连接(虚连接)的传输层协议
虚连接 ------ 并不是实际的物理连接,只是使用时就好像两个进程之间直接建立了点对点的连接。实际上连接过程是把数据报加上各个层次的首部之后放到链路上传输,然后在接收端进行步步解封装,这是一个完整的物理连接
-
每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的
TCP协议不能用于广播和多播通信方式
-
提供可靠交付的服务,无差错、不丢失、不重复、按序到达。可靠有序,不丢不重
-
提供 全双工通信
发送方和接收方角色不定,双方可以同时发送数据也可以同时接收数据
TCP协议连接的两端都会设置发送缓存,接收缓存发送缓存:应用层准备发送的数据&已发送但尚未收到确认的数据
接收缓存:按序到达但尚未被应用程序读取的数据&不按序到达的数据
-
TCP 面向字节流
流:流入到进程或从进程流出的字节序列
虽然进程和TCP交互时一次发送一个数据块,数据块可能大小不一样,但TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流
发送方发送文件时会把文件按照字节排序编号并放入TCP缓存,再取几个字节加上TCP头形成TCP报文段再放到链路上传输
-
传输单位是报文段。
2)TCP报文段首部格式
以上图为例发送"123"报文段时,该报文段首部序号字段填1
接收端已经收到了"123"报文段就会给发送端发送首部确认号字段为4的报文段
由数据偏移字段可知首部最大为60B
将RST置为1还可以用来拒绝一个非法报文段,或者拒绝打开一个链接
发送方根据接收方报文的窗口字段设置发送窗口大小
检验时加上的伪首部的第四个字段其实就是协议字段,在UDP当中是17,而在TCP当中应该是6
紧急指针指出紧急数据的末位在报文段当中的位置。如紧急指针值为50,则TCP数据部分的前50个字节均为紧急数据,剩下的为普通数据
MSS指的是每一个TCP报文段当中数据字段的最大长度
填充字段保证首部是4B整数倍,通常填充全0字段
2.TCP连接管理
1)TCP连接管理
TCP连接传输分为三个阶段:
TCP连接的建立采用客户服务器方式,主动发起连接建立的应用进程叫做客户,而被动等待连接建立的应用进程叫服务器。
2)TCP的连接建立
注意:!!!!!!!!!!!!!!!!!!!!!!!!!!!!:
Round1 ACK=0,ack无效,同步序列编号SYN=1,生成初始序列好seq=x。
Round2 由于连接请求报文段没有数据部分,ack=x+1(表示希望下次接收到的序列号seq=x+1),同时确认号ACK=1,SYN=1,生成服务器的序列号seq=y。
Round3 SYN只在请求连接和连接接受时置1,所以SYN=0,同时对应seq=x+1,ack=y+1。此阶段可以携带数据!!
又叫三次握手。
3)SYN洪泛攻击
解决方案:SYN cookie
4)TCP的连接释放
Round1 由于TCP为全双工,此客户端也有可能为之前的服务端。由于连接释放报文段通常没有数据,所以序号u也可以标识报文段(seq=u),同时终止位FIN=1。
Round2 服务器端回一个确认报文段,ACK=1,seq=v,ack=u+1。此时服务器端仍可以发送数据。
Round3 当服务器发送完数据,就释放报文段,主动关闭TCP连接。FIN=1,ACK=1,seq=w,ack=u+1。
Round4 如果客户端发送的确认报文段没有到达服务器端,服务器端会重传连接释放报文段,客户端在2MSL内收到就会重传确认报文段并重新启动2MSL计时器。如果客户端不等待2MSL的时间而是在发送完确认报文段后直接释放连接,报文段丢失时客户端就无法接收服务器端重传的连接释放报文段,服务器端会一直发连接释放报文段而无法正常关闭。ACK=1,seq=u+1,ack=w+1
又称四次挥手。
3.TCP可靠传输
TCP可靠传输
1)序号
TCP的首部的序号字段。TCP协议面向字节流,因此TCP传输时以字节为单位,对字节依次编号。实际发送会把多个字节放在一起组成报文段发送,报文段大小不定,取决于链路层MTU。
对于文件或者要发送的数据,第一个字节的序号可以是随机的
2)确认
TCP首部的确认号是期望接收到对方下一个报文的数据的第一个字节的序号 。(ACK)
发送方在收到对发送报文段的确认之前,TCP缓存区应保留报文段。
接收方此时收到了"123"报文段,就会发送一个首部确认号字段为4的确认报文段,在发送方收到后把TCP缓存中的"123"报文段删去
接收方可在合适时候发送确认报文段,也可在要发送数据时把确认信息捎带上,即捎带确认
接收方采用累积确认,只确认数据流当中至第一个丢失字节为止的字节
假如发送端此时发送了"456"和"78"两个报文段,但接收端只接收到了"78"报文段,接收端还是会一直发送确认号为4的报文段。在收到确认号为4的报文后,发送端会重传"456"报文段。在接收端收到"456"报文段后,下次发送的确认号应为9。
3)重传
TCP协议也有发送窗口和接收窗口的概念,在发送过程中会使用GBN协议和SR协议,使用时同链路层讲过的大同小异
4.TCP流量控制
1)TCP流量控制
希望对方发送不要过快。利用滑动窗口机制。要求发送方 有个接收窗口rwnd。
5.TCP拥塞控制
1)TCP拥塞控制
拥塞控制是全局性问题,接收方并不知道拥塞情况具体是哪几台主机发送数据过多造成的。而流量控制是点到点之间的问题,接收方知道找哪个发送方。
拥塞控制四种算法
2)慢开始和拥塞避免
注意!!!!!!!!!!!!!!!!!!!!:
cwnd=n表示为n个报文段,长度都为MSS
慢开始cwnd翻倍在收到之前发送报文的确认后立刻发生
首先慢开始 ,拥塞窗口指数增长 ,当到慢开始门限ssthresh时,此时变为拥塞避免 ,拥塞窗口为线性增长,当出现网络超时,将ssthresh变为网络拥塞时****拥塞窗口的一半,重新执行慢开始,直至遇到新的门限值,在拥塞避免。
3)快重传和快恢复
快恢复:发送方尽快的进行重传,而不等超时计时器超时在重传。要求接收方不要等待自己发送数据时才进行捎带确认,而是立即发哦是那个确认。
首先还是慢开始和拥塞避免,当网络拥塞时,发送方接收到三个重复的确认 执行快重传 ,接着将拥塞窗口变为一半 ,执行快恢复。