一文了解,网络编程中TCP和UDP协议,以及三次握手,四次挥手等基本原理

前言

        TCP和UDP协议是网络编程中重要的传输协议,在客户端和服务端起到一个通信的作用,只有在符合协议的情况下,才可以进行通信,下面是一些重要知识点,主要使用于面试问答,不涉及代码。

正文

01-TCP和UDP协议
TCP协议

        TCP协议是一种面向连接的可靠性传输协议,使用序号和确认机制确保数据可靠传输,提供流量和拥塞控制机制,避免网络拥塞。

TCP协议应用场景

        效率要求相对低,但对准确性要求相对高的场景。效率没有UDP高。比如:文件传输(准确高要求高、但是速度可以相对慢)、接受邮件、 远程登录

UDP协议

        UDP协议是一种无连接的不可靠传输协议,它数据包形式发送数据,不提供可靠性保证,也不提供拥塞控制机制。UDP适用于对实时性要求较高的场景,如音频,在线游戏等。

UDP协议应用场景

        效率要求相对高,对准确性要求相对低的场景。比如QQ聊天、在线视频等,速度要求高,但是出现偶尔断续不是太大问题。

TCP和UDP协议的区别

        (1)、TCP 是面向连接的,UDP 是面向无连接的。

        (2)、UDP程序结构较简单。

        (3)、TCP 是面向字节流的,UDP 是基于数据报的。

        (4)、TCP 保证数据正确性,UDP 可能丢包。

        (5)、TCP 保证数据顺序,UDP 不保证。

02-TCP协议怎样保证可靠性

        (1)、建立连接(标志位):通信前确认通信实体存在。

        (2)、序号机制(序号,确认号):确保了数据是按序,完整到达。

        (3)、数据校验(校验号):CRC校验全部数据。

        (4)、超时重传(定时器):保证因链路故障未能到达数据能被多次重发。

        (5)、窗口机制(窗口):提供流量控制,避免过量发送。

        (6)、拥塞控制。

03-TCP协议的三次握手建立连接
三次握手流程

        SYN指的是同步;ACK指的是确认;Client指的是客户端;Server指的是服务端

        (1)、Client将标志位SYN置为1,并将该数据包发送给Server,Client由CLOSED状态进入 SYN_SENT状态,等待Server确认。

        (2)、Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为 1,并将该数据包发送给Client以确认连接请求,然后Server进入 SYN_RCVD状态。

        (3)、Client收到确认后,检查ACK是否为1,如果正确则将标志位ACK置为1, 并将该数据包发送给Server,Server检查ACK是否为1,正确则连接建立,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

为什么三次握手

        (1)、比如A向B发送了一个连接请求,但是由于某些特殊情况,请求失效了,那么A也就是不需要再连接了,但是这个失败的请求又送到了B,此时如果是两次握手,B就会认为已经连接成功,浪费资源。

        (2)、A向B发送的连接请求,也有可能因为链路故障导致报文段延迟到达B,此时可能A已经下线,然而B会认为A发送了请求,两次握手的话就会直接建立连接,导致B浪费资源。

04-TCP协议的四次挥手断开连接
四次挥手流程

        FIN指的是结束;ACK指的是确认;Client指的是客户端;Server指的是服务端

        TCP连接是全双工的,两个方向必须要单独进行关闭,流程是当一方完成数据发送任务后,发送一个FIN来终止自己这个方向的连接,但是不能影响另一方向是否还在发送。只是收到FIN标志位的这一方向上不会再收到数据了。最后当这一方向发送完所有数据也发送了FIN。则表示两方均关闭。

        (1)、数据传输结束后,客户端发出断开连接标志位,并停止发送数据,进入 FIN_WAIT_1状态,此时客户端依然可以接收服务器发送来的数据。(向服务端发送FIN)。

        (2)、服务器接收到FIN后,发送一个ACK给客户端,确认收到客户端发来的结束标志位,服务器进入CLOSE_WAIT 状态(这个标志指的是服务端可能还有数据没有发送完毕,还在发送)。客户端收到后进入FIN_WAIT_2状态。(向客户端发送ACK)

        (3)、当服务器没有数据要发送时,向客户端发送一个FIN报文,此时服务器进入LAST_ACK状态,等待客户端的确认。(向客户端发送FIN)

        (4)、客户端收到服务器的FIN报文后,给服务器发送一个ACK报文,此时客户端进入TIME_WAIT状态,等待2MSL(MSL:报文段最大生存时间),然后关闭连接。(向服务端发送ACK)

为什么四次挥手

        假设是三次挥手,首先释放了A到B方向的连接,此时TCP连接处于半关闭状态, 这时A不能向B发送数据,而B还是可以向A发送数据。如果此时A收到了B的确认报文段后,就立即 发送一个确认报文段,这会导致B向A还在发送数据时连接就被关闭。这样会导致A没有完整收到B所发的报文段。

几种特殊状态

        (1)、FIN_WAIT_2状态:半关闭状态,发送断开请求的一方已经没有发送能力,但是仍然有接收能力。

        (2)、CLOSE_WAIT状态:被动关闭连接一方接收到FIN包,会立即发送ACK,表示收到请求,被动关闭一方如果还有数据没有发送完毕,就会进入这个状态。

        (3)、TIME_WAIT状态:又叫2MSL等待状态,为了防止服务器没有接收到最后一次挥手时,客户端发送的ACK数据包,防止服务端重传FIN。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一伦明悦

感谢,您的支持是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值