3.简易版TCP,UDP
TCP和UDP的区别在于一个基于连接一个基于非链接
三次握手
为什么要三次握手而不是两次握手
数据包syn1因为某些网络原因滞留在中间,客户端因没有收到回应,因此会重发syn包也是就syn2
这次的包正常发送,并且服务端回复了SYN+ACK包之后建立起了连接
而后第一包阻塞的网络连接突然恢复,SYN1又传递到了服务端,此时服务端认为是客户端发起的新连接
从而在两次握手之后进入了等待数据的状态,服务端任务是两个连接而客户端认为是一个连接
如果在三次握手的情况下,服务端借不到最后的ack包不会认为是连接状态,自然不会认为连接成功
对于下图的理解、
1.经过三次握手之后,客户端和服务端都进入了数据传输状态,一包数据可能被拆成多包数据发送,如何解决丢包问题和乱序问题?
2.TCP协议为每一个连接建立了一个发送缓冲区,第一个字节的序列号为0,往后累加1
3. 发送数据的时候,在发送缓冲区取一部分数据组成发送报文,在其TCP协议头中附带序列号和长度
4. 接受端在接收到数据后需要回复确认报文ACK=序列号+长度=下一包数据起始序列号
5.发送端可以一次性发送多包数据,接收端只需要回复一次ACK就可以了
6.发送端可以把待发送的数据分割成一些列碎片,发送到对段,对段根据序列号和长度,在接收后重构出来完整的数据,假设其中丢失了某些数据包,
接收端可以要求发送端重传,比如丢失了100-199,接收端向发送端发送ACK=100的报文,发送端收到之后重传这一包数据,接收端进行补齐
7.以上的过程不区分客户端和服务端,TCP连接是全双工的,对于两端来说均采用上述的机制
四次挥手
为什么客户端需要等待超时时间
是为了保证对方收到了ACK包,假如客户端发送了ACK包后立马关闭,一旦ACK包在网络中丢失服务端将一直停留在最后确认状态
如果服务端没有收到ack包会重发fin包客户端则会重发ack包并且重新刷新超时时间
UDP协议
TCP适合传输文件,发送邮件,浏览网页等
UDP只会把数据包封装一下直接从网卡上发出去就行了,数据包之间并没有状态上的联系适用于域名查询,语音通话,视频直播,隧道网络