tcp叫段,udp叫报,ip叫包,链路层叫帧。
我们在网线中跑的就是帧。
tcp段和udp报没有长度限制,只有在ip层和链路层才有包和帧的最大限制。
一个tcp段,在tcp缓存区中被封装,然后传到ip层进行拆分和封装,然后到链路层进行拆分和封装,然后传出发送终端,之后在电路中就是以数据帧的形式进行传输的,当进入不同的链路层子网中时,会修改链路层协议的头。只有到达接收终端后,计算机才会将帧进行组装。
数据帧在在子网中,通过arp协议的网关ip将帧发送到网关进入公网,公网可能会进行nat转换,在公网中通过ip进行路由,当进入目的子网网关后,通过MAC地址和arp协议路由到目的终端。
网络层是终端之间的通信,而运输层是端口之间的通信(进程通信)。
ip协议是不可靠服务,udp也是不可靠协议,不能保障能将数据完整地全部地发送到目的端口。
tcp通过流量控制,序号,确认,定时器保障了有序正确地将数据发送给接收人。tcp还提供了拥塞控制,udp流量是不可调控的。
socket在应用层和运输层之间,connect是第一次握手,accept是第二次握手,发送者回复的ack是第三次握手。
udp只在ip上面加了目的端口,源端口和一个验证字段和长度,程序员几乎就是在和ip协议打交道。dns是使用udp的一个例子。
CP采用三次握手的过程可以确保连接的可靠性和稳定性,防止过期连接的建立,并有效避免连接建立的混乱情况。
防止过期连接的建立:
如果服务端在一定时间内没有收到客户端的确认,那么服务端会超时关闭这个连接请求,避免了过期连接的建立。就是关闭了这个建立的socket
如果客户端在一定时间内没有收到服务端的确认,那么客户端会重传 SYN 包,直到收到服务端的确认或达到最大重传次数。
tcp是全双工的,所以需要两者都确认关闭,所以是四次挥手:
一方发送 FIN 标志的数据包给对方,表示自己不再发送数据,但仍然可以接收数据(第一次挥手)。
ip是尽力而为的交付服务,也是不可靠服务。
udp也是不可靠服务,没有ack,不能保障消息到达。
tcp通过使用流量控制,序号,确认和定时器,保障了有序到达,是可靠服务。tcp还提供了拥塞控制,通过调节发送端发送进网络的流量速率来做到。
一个进程可能有多个套接字,但是一个端口只能由一个tcpsocket监听,一个udpsocket监听。
udp的内容包含:
源端口:目的端口
长度 :检验和
剩下的就是报文了
停等协议
发送方只维持一个帧窗口,发送完在接收响应前阻塞等待,接收方验证成功返回ack,验证失败返回nak。
GoBackN协议(GBN)
流水线:通过给报文添加序号,像流水线一样通过网口发出报文。
定时器:报文超时重发。
累计确认:接收方接收到多个报文后,发送一个已经接收到的顺序报文的最大ack。
窗口:发送方维持一个窗口,接收方只维持一个窗口用来接收上一个返回的ack报文。所以不会缓存接收到的ack以后的报文。
重传(返回ack):因为接收方只维持了一个端口,所以如果下一个收到的不是ack的,那么流水线中跑的那些报文不会接收,返回窗口的ack,需要全部重传。
选择重传(SR)
窗口:发送方和接收方都维持窗口,即都有缓存报文。
返回ack:发送方接收到ack就会移动到ack的地方(因为累计ack),如果接收方接收到了窗口右侧的报文而没有收到左侧的报文,就会返回最小左侧窗口的ack。
TCP使用了选择重传协议
TCP是全双工的可靠服务。
TCP有发送缓存和接收缓存。
TCP报文段结构:
MSS:MSS的选择一般要考虑到MTU,以避免IP分片,MSS主要用于在TCP连接建立时进行协商,通常是在TCP的三次握手过程中通过TCP选项字段进行交换。选出两者小的MSS。
16位窗口大小:用于流量控制。
标志位:
序号(seq)
报文段的序号是按照字节排序的,比如发送0-2000,MSS是500,那么第一个报文就是0-499,seq=0.
确认号(ack)
0-499的ack响应报文的ack=500.即下一个请求的起始字节。
累计确认,捎带确认
超时重传
流量控制
TCP通过让发送方维护一个接收窗口的变量来实现流量控制,接收窗口是由接收方给发送方的ack中携带的,表示该接收方还有多少字节的接收缓存空间。
连接双方作为发送端,都需要维持一个接收窗口(rwnd)。
当发送方的接收窗口变量为0时,说明接收方没有缓存空间了,发送方会发送只有一字节的报文段,直到返回的ack的rwnd不为0.
进程从udp的缓存中读取数据如果不够快,满了就会溢出,就会丢弃报文段。
三次握手
- 客户端connect,发送的报文段不包含应用层数据,SYN置1,seq=客户端随机序号。
- 服务器accept接收到请求,为客户端建立缓存和变量,返回SYN=1,ack=客户端随机序号+1,seq=服务器的随机序号。
- 客户端收到SYN后,给连接分配缓存和变量,返回ack,可以携带应用层数据。
四次挥手
FIN-ACK,FIN-ACK.
FIN代表不发送了。
拥塞控制
TCP的拥塞控制是为了确保网络中的流量不会超出网络的容量,从而避免网络拥塞导致的数据丢失。
tcp如何判断路线发送了拥塞?
- 超时或者三次冗余就减速。(三次冗余:如果发送端连续发送相同的数据包并且等待确认的次数达到三次)
- 一个确认的ack会给发送加速。
如何调整发送速率?
通过调整窗口(cwnd)的数量。(每个报文段中的16位的rwnd,是用来流量控制的,取决于接收方还有的缓存空间;而拥塞控制的窗口是滑动窗口的数量)
发送方的未确认的数据量不会超过cwnd和rwnd。
慢启动
cwnd一开始为一个MSS,然后收到一个ack就2的指数增长。
拥塞避免
当发送方有一个超时后,意味着拥塞,会重新慢启动,但是达到发生拥塞的cwnd/2时,进入拥塞避免阶段,以cwnd线性增长。
快速恢复(加性增,除性减)
当发送方有一个三次相同的ack(冗余ack)时,cwnd/2,然后线性增长。