TCP UDP学习笔记

TCP连接三次握手的过程

初始状态客户端CLOSED,服务器LISTEN

1. 客户端A向服务器B发送SYN数据包(SYN, x:0)请求连接。此时状态为SYN_SENT,表示客户端已发送SYN报文。

2.     服务器B收到,发送SYN/ACK数据包(SYN/ACK, y:x+1)回应。此时服务器状态由LISTEN(服务器socket处于监听状态,可以接受连接)变为SYN_RECV,表示收到SYN报文

3. 客户端A收到并发出确认ACK(ACK, x+1:y+1),连接成功。双方状态ESTABLISHED

TCP四次挥手的过程

初始状态双方ESTABLISHED

1. 客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。客户端FIN_WAIT_1。表示主动关闭连接,向对方发送了FIN,进入FIN_WAIT_1,等待对方的确认

2. 服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。客户端FIN_WAIT_2,表示半连接,而服务器可能还有数据要发,这边稍后关闭。服务器CLOSE_WAIT。

3. 服务器B关闭与客户端A的连接,发送一个FIN给客户端A。服务器LAST_ACK,等待对面的ACK报文

4. 客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。客户端进入TIME_WAIT,表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。

为何TIME_WAIT:

防止服务器在处于LAST_ACK状态下未收到ACK报文而重发FIN报文,这个TIME_WAIT 状态的作用就是用来重发可能丢失的ACK报文。

TCP和UDP的特点

TCP面向连接,UDP无连接

TCP可靠,保证安全,UDP尽最大努力交付,不保证安全

TCP是点对点的,UDP可以一对一 一对多 多对多 多对一

TCP面向字节流,UDP无拥塞控制

TCP开销较大,UDP开销小

TCP、UDP的应用场景

UDP使用场景 DNS协议(因为用UDP快),看视频、发语音、QQ聊天、多媒体教室屏幕广播

TCP使用场景 HTTP协议,QQ传文件,邮件,登陆

TCP怎么实现可靠传输

确认和重传机制:建立连接、发送包时的确认,运输过程中校验失败、丢包或延时发送端重传

数据排序:把数据分成很多包,按顺序进行传输

流量控制:滑动窗口和计时器

拥塞控制:慢启动、拥塞避免、快速重传、快速恢复
作者:wy9
链接:https://www.nowcoder.com/discuss/393011
来源:牛客网
全部评论

相关推荐

被腾讯云捞起来面的,笔试都还没做。和蔼型面试官,上来自我介绍提了提项目(一个java一个C++)。1.锁了解吗说一下。2.怎么避免死锁?程序方面怎么设计?(说用的很少,只记得有个接口可以)3.TCP怎么保证传输安全性?4.线程池讲一下,需要注意哪些参数?怎么创建线程池比较好?5.核心线程数和最大线程数怎么设置?(答任务分CPU密集和IO密集)6.为什么要有阻塞队列?7.我要设计一个具有任务优先级性质的线程池怎么设计?(说了下调整成优先阻塞队列参数,或者考虑具体任务的重要程度...有点胡诌但还是尽量说了)8.JVM内存管理了解吗,如果我要保证一个对象不被回收应该怎么设计?这题,我答的方向是垃圾回收,说设计一个常量对象保持不断对它的引用就不会被回收。面试官说的是ByteBuffer类,直接分配的字节缓冲区,不收JVM控制。感兴趣去搜一下。9.进程之前怎么通信?(答的时候结合项目多说了下共享内存)10.你这个C++项目里面用了共享内存?怎么用的,是怎么考虑的,遇到什么问题?(开讲)11.看你项目用了redis,说下怎么用,具体实现,为什么要用?(没用过分布式锁但研究过,讲到最后扯了一下)12.手撕。给了一个很简单的字符串遍历。然后我真的是6,写到最后各种bug,然后调了半天,面试官甚至想指出我的问题,然后我说我自己检查一下,然后当场秀println()控制台调试大法······最后是一个非常笨比的错误,绷不住了,睡不着了。人家还是看着我调出来了·····毕竟这就没考算法,看看编码习惯,点了下。反问。业务相关,反馈什么时候出。下午17:00~18:20结束晚上发现进二面了。 #面试# #后端# #实习# #腾讯# #腾讯云#
点赞 评论 收藏
转发
点赞 4 评论
分享
牛客网
牛客企业服务