一、传输控制层
首先是遵循http协议才能连接
什么是TCP?
1、面向连接的---》双方经过了三次握手开辟了资源才叫链接
2、可靠的传输
什么是链接?--->三次握手
传输控制层客户端api发出的第一个包 syn,
百度那边收到了,就会给回一个确认的包(syn+ack(确认))
api 会再次发一个syn 这就是三次握手
为什么是三次握手?
1、客户端给服务端发送一个包syn,
2、服务端给客户端回一个包syn+ack(这表示客户端的输入输出是通的)
3、客户端收到后还需要再给服务端发送一个ack包 让服务段知道他的通信(输入输出也是同的),这种确认机制,就是面向连接的、可靠的传输
三次握手之后,就可以数据发送了(我发你接,你回我收)
中间是数据交互往来,比如客户端访问百度页面
1、客户端给服务端发送请求数据
2、服务端给客户端回响应数据
防止丢包 乱序等问题,
tcp为每一个链接建立了一个发送缓冲区
发送数据时,从发送缓冲区取出一部分数据组成发送报文,而tcp协议会有序列号和长度
也就是 报文=序列号+长度+数据内容
回复确认ack = 序列号+长度 = 下一包的起始序列号
这种一问一答的发送方式,能够使发送端确认发送的数据已经被对方收到,发送端也可以一次发送连续的夺宝数据,接收端只需要回复一次ACK就可以了
这样发送端可以把待发送的数据分割成一系列的碎片发送到对端
对端根据序列号和长度在接收后重构出来完整的数据
假设丢失了某些包,在接收端可以要求发送端重传,比如丢失了100-199这100个字节,接收端向发送端发送ACK=100的报文发送端收到后重传这一包数据,接收端进行补齐,以上过程不区分客户端和服务端,对于两端来说均采用这个机制
数据发送完毕后,还有四次挥手
为什么要四次挥手?
涉及到了socket,套接字,唯一表示 ip+port(ip客户端,port 端口号(进程):ip+port(服务客户端,port 端口号(进程)),而操作系统可以分配的端口号是65535个
面试题:客户端A:80 与 一个服务端的进程(百度)B80,最多可以建立65535个链接!
客户端A:80 与一个服务端的进程QQ C80 同样最多是可以连理65535个链接,这是套接字,4个因素的呢
这就是说双方要同时释放资源,而不是单方面释放资源
1、客户端想要结束就会给服务端发一个fin包(我要准备和你分手了),自己进入终止等待1状态
2、服务端会给客户端回一个ack包(服务端表示我知道了)表示进入关闭等待状态(客户端进入终止等待2状态),服务端此时还可以发送未发送的数据,而客户端还可以接受数据,待服务端发送完数据后
3、当服务端数据传完了后,服务端回给客户端再次传输一个包fin,服务端进入最后确认状态
4、客户端收到服务端发送的结束包后,会再次给服务端发送一个ack包,进入超时等待状态,经过超时时间后关闭链接,而服务端收到ack包后立即关闭链接
为什么客户端要有超时等待时间:这是为了保证对方收到ACK包,如果客户端发送完最后一包ACK包就释放了链接,一旦ACK包再网络中丢失,服务端将一直停留在最后确认状态,如果客户端发送最后一包ACK包后等待一段时间,这时服务端因为没有收到ACK包会重发FIN包,客户端会响应这个FIN包,重发ACK包并刷新超时时间,这个机制和三次握手一样,是为了保证在不可靠的网络链路中进行可靠的链接断开确认
至此双方资源都释放掉了
即:三次握手->四次数据往来->四次挥手
传输控制层是控制这个包。
二、网络层是告诉这个包怎么走
IP:一个ip地址由网络号+主机号组成的
UDP 协议:是基于非连接的,发送数据就是简单的吧数据包封装一下,然后从网卡发出去就可以了,数据包之间并没有状态上的联系,这种简单的处理方式,导致他的性能损耗非常少,对于cpu内存资源占用少,带式丢包UDP不能保证