传输层
负责数据能够从发送端传输到接收端
IP地址
(Internet Protocol Address),全称网际协议地址,唯一地标识了网络中的主机地址
端口
端口标识了主机上的为一个进程
在TCP/IP协议中,用“源IP",“源端口号”,“目标IP”,“目标端口”,”传输层协议“,这样一个五元组来标识一个通信(可以在cmd中,用netstat -n 命令来查看
注意:一个端口号只能属于一个进程(在写一个服务器时,如果你用了和本机上某一个进程一样的端口号,你会发现在运行时,会报该端口已被使用的错误),由于某些应用程序会有多个进程,所以对于应用程序来说会有多个端口(毕竟,端口只能标记一个进程)
端口号划分
0-1023:知名端口号,HTTP,FTP,SSH等这些广为使用的应用层协议,他们端口号都是固定的
1024-65535:操作系统动态分配的端口号,客户端的端口号,就是由操作系统从这个范围动态分配的
常见的协议默认端口
HTTP服务器:使用80端口
HTTPS服务器:使用443
UDP协议
①UDP协议格式
16位源端口,16位目标端口,16位UDP长度,16位UDP检验和,数据(可以没有)
- 16位UDP长度,表示整个数据报(UDP首部+UDP数据)的最大长度
- 如果检验和出错,就会直接丢弃(对于接受端的传输层UDP会通过检验和,检验数据是否大概率是发送端发送的数据,如果不是,那这个数据就是错误的信息,没必要给应用层,就会直接丢弃)
- 数据前面的属于包头:发送端的UDP对数据进行打包(就是除了数据包括以上的信息),接收端的UDP对接受的到的信息进行解包(去包头),分用(根据目标端口交给应用层的进程)
UDP的特点
①无连接
②不可靠
③面向数据报文
- 为什莫说UDP不可靠呢,拿 请求/响应模式 这种思路来考虑,UDP只管发,相当于只请求,没有响应,意味着不知道接收端有没有收到自己的信信息
- 无连接指的是想发就发,不需要准备工作
TCP协议
为什么说TCP是可靠的
TCP可靠性指的的是,TCP会尽最大努力,让数据正确的发送给对方,但它不能保证一定可以发送给对方(因为数据的最终传输是通过硬件层的传输,可能会因为信号衰减等别的原因,会出现错误(这里我是拿硬件层来理解的))
*数据会尽力发给对方,至少发送端的应用层会知道发送失败的情况
- TCP会选择合适的数据大小发送(流量控制),而不像UDP,应用层给多少数据,就发送多少数据。TCP也会保证接受端接受信息,会是按顺序来的
- TCP会做重传操作,所以有时候,会出现接收到重复的数据。TCP会负责处理
TCP怎么知道对方有没有收到数据
接收端会根据TCP内部规则的时间内,是否收到接收方的应答,确定是否发送信息失败
TCP发现收据丢失之后,会进行超时重传
① TCP既有重传机制又有缓冲区,说明,它会保留发送的数据,在发送失败之后,进行重传
② 如果重传也失败,再次重传,超时时间增大,TCP内部规定了一个重传次数,如果达到该次数,告诉发送方的应用层出问题
注:超时时间指的是,发送消息到没有接受消息的时间(这个时间是内部规定的,比如:500ms)
没有应答会是以下几个情况
① 对方没有收到信息
② 对方的应答没有丢失
对于应答,应答的是那份数据,具不具备应答能力,包头信息中,引入序列号(Sequence Number ,简写 SN),应答序列号(Acknowledge Sequence Number,简写ASN),ACK( Acknowledge的缩写)
- SN : 发送数据时,该批数据的编号,为第一个自己的编号
- ACK: 0代表不具有应答能力(一般来说,如过没有应答,它的值不会呗改变),1代表有
- ASN: 应答那批数据(当ACK = 1 才有用)
当第一发送的数据长度为100,SN为0,当应答回来之后,ACK变为1,ASN=0+100=0,SN = ASN
这些表示,下一次应答的为100字节以后的,因为ACK为1.,ASN=100表示,下一次期望的数据是从100开始
有了序列号之后,解决了
①确认—应答机制,接收方应答正确的序号,发送方根据ASN,知道那些数据已经被收到
②乱序的问题,由于TCP的流量控制机制,可能会产生乱序,TCP接收方的缓冲区,会根据序号对数据排序,再给应用层
③去重问题。根据序列号会知道(ASN),确定数据是否已经被收到
连接管理
①TCP内部管理这些数据
②由于应用层会收到来自多个用户的请求,所以每个用户会有一个自己的通信通道,TCP会管理各自的信息。
③五元组信息是连接的唯一标识
TCP通信
TCP在正式通信之前 ,有一些信息是不知道的(需要双方的TCP互相同步一波信息),五元组信息等…
- 简化步骤是:A介绍自己,B回应A的介绍(B介绍自己),A回应B
个人理解:这样既是完成五元组信息,也是确保A能回应B,B也能回应A,所以是三次