目录
一、传输层协议:
1)TCP/IP协议族的传输层协议主要有两个:
TCP(Transmission Control Protocol ) :传输控制协议
UDP(User Datagram Protocol ) :用户数据报协议
2)TCP协议特点:
TCP是面向连接的服务、可靠的进程到进程通信的协议(因为在TCP包头里面封装了端口号,端口号就意味着一个服务,一个进程)
(网络层的IP协议完成点到点的通信,传输层的TCP协议完成的是进程到进程的通信,进程就是一个终端里面的一个服务)
TCP是完成可靠的进程到进程通信,而UDP是完成非可靠的进程到进程通信,因为TCP是面向连接的服务
TCP是面向连接的服务理解:
TCP是属于四层,而对于五层的服务来说,就是一个“打工的”,四层为五层提供服务,四层能够识别五层,应用层生成完数据就会往传输层去扔,扔过去就不管了
四层就开始琢磨了,这个数据我怎么传过去呢?这个时候就要看两个方向,一个是TCP,一个是UDP,如果你要是扔给tcp了,tcp会先把你的数据放到一边,tcp跟应用层的“老大”说:“你这个信息我还没办法往对方那传,我要提前跟对方建立连接”,这时候TCP把应用层的数据先放到一边,先缓存起来,然后四层与四层进行对话,这个过程中,由TCP生成一个TCP包头,其中这个包头里面有跟对方的聊天记录,这个对话跟五层没关系,只跟四层有关系,然后三层、二层、一层进行封装,封装完之后你会发现由TCP尝试和对方的TCP尝试建立连接的时候,聊得这个天,这个帧是没有五层数据的
所以说,将来如果抓到一个帧,这个帧里面没有五层数据,从四层开始的,很显然这个帧是传输层的两端TCP在聊天,聊什么天呢?“我这边老板要和你那边老板通信了,咱俩建立个连接呗!”,最终我们两个之间建立了一个TCP链路,这个tcp链路之所以可以提供可靠的进程到进程通信(可靠的老板到老板通信),就是因为我与对方建立了链接,而这个连接有一些机制,这个机制促使我这个链路是可以可靠的完成进程到进程通信。
什么机制呢?有了这个链接,我们就可以有重传机制,我跟老板说“我跟对方已经建立了链接,你尽情的往这扔数据吧!”,这时候老板就大量的往四层扔数据,那我四层就会刷刷的把这些数据扔到链路上去,扔的时候对方可能没收到,这时候我这边的“秘书”就会拿个“小闹钟”,这个“小闹钟”只有TCP有,UDP没有,TCP会看这个“小闹钟”:比如说2s到了,对方怎么没有搭理我啊?,我可能数据没发过去,这时候老板跟我说的话我再重传,只要你不跟我回话我就一直重传,这个重传的目的就是为了让数据一定能到达对方。如果双方不再通信了,双方的“秘书”也要提前沟通交互,完成一个交互状态的协商达成去断开这个连接
一旦建立连接之后我发了个信息对方没回,如果一直没回,秘书就会跟老板说已经出现问题了,这时候你的老板就会出现两种状态,第一种就是报错,第二种情况就是死机了,秘书不工作了,秘书不把信息传过去了,这时候就显示网络有问题,你的秘书就开始琢磨了:“我已经通知老板了” 老板说你不要给我发数据了,这个链路已经出问题了,但是老板那个软件死记报错了,但是作为秘书,我和对方的连接还在,换句话说:一旦我和对方建立连接之后,在我的电脑的缓存中就会生成一条会话状态,这个会话状态叫establish,代表已建立会话状态,他会占用我的会话状态,而一台电脑上的会话状态是有限的,一直发没有回复,直接在本地把这个会话断掉,在我的世界就好像我没有跟对方建立过会话。如果这时候应用层再跟我发信息说要跟他对话,我要重新跟对方建立连接。
TCP提供全双工服务,即数据可在同一时间双向传输(全双工就是我和对方聊天的同时,对方也能跟我聊天)
3)TCP报文段/封装
TCP报文段封装在IP数据22报中
4)TCP包头分析:
注释:
端口号范围:0-65535
源端口号:是客户端进程随机生成的,一般是从50000开始的
目标端口号:一般是服务器固定的。如:mysql:3306
序列号seq:TCP为每个字节都进行了编号。
确认号ack:通过ack来确认每个字节是否收到,判断是否需要重传!
控制位(可以理解为开关位)每个占1bit,就是1和0,1代表开,0代表关:
SYN:请求建立连接位(如果被置位了,表示这是用来建立连接的第一个报文)FIN:请求断开连接位 (如果被置位了,表示这是用来关闭连接的第一个报文)
RST:重置位,强制对方断开连接,释放会话(如果被置位了,表示TCP连接要重新建立)
PSH:推送位,推送数据到应用层,为1时为有应用层数据
ACK:确认位,该位为开关,为1时,ack号有效,为0时,ack无效。(如果被置位了,表示这个报文也是一个确认报文)
URG:紧急位,为1时,代表有些字节为紧急数据,需要第一时间推送到应用层,需要与紧急指针配合。(如果被置位了,表示需要第一时间推送到应用层)
置位就是=1
窗口大小:win窗口,用于通知发送方自己的缓存大小。
校验和:校验整个TCP段
5)TCP的三次握手建立连接
第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
在三次握手中,有一个著名的攻击,流程如下:(SYN泛洪攻击---属于DOS攻击)
黑客大量向服务器发送第一个包,这时候在服务器的缓存里面就会记录一条会话状态是SYN_RECEIVED,紧接着服务器给黑客一个回应,黑客不给回应
黑客大量伪造第一次的握手数据包,并且不给回应,在服务器上就会有大量握手对话,而且还没有成功,服务器的会话已经被占满了。(把你“秘书”占满了),这样你的服务器无法为客户提供正常服务。
6)TCP的四次握手断开连接
1)客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
2)服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
3)客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
4)服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
5)客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
6)服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
7)UDP协议特点
无连接、不可靠的传输协议
(老板把数据给了我,不跟对方建立连接,我的秘书从来不跟对方秘书聊天,直接扔出去,对方能不能收到也不管了)
花费的开销小(udp包头里面就不需要封装那么多字节)、传输效率较高
8)UDP协议包头:
注释:
UDP长度:用来指出UDP的总长度,为首部加上数据
校验和:用来完成对UDP数据的差错检验,它是UDP协议提供的唯一的可靠机制
部分参考:https://blog.csdn.net/qq_38950316/article/details/81087809