博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TCP&UDP基础
阅读量:6293 次
发布时间:2019-06-22

本文共 2020 字,大约阅读时间需要 6 分钟。

TCP

TCP/IP是一种网络通讯协议,而socket则是TCP/IP网络最为通用的API,即一种应用程序接口,称为套接字。TCP是面向连接的协议,在进行数据收发前必须连接,且在收发时必须保持该连接。在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG。其中SYN(synchronous)表示要求建立连接,ACK(acknowledgement)表示应答,FIN(finish)表示要求关闭连接,PSH(push)表示有数据传输,RST(reset)表示连接重置,URG(urgent)表示紧急。

1. TCP的三次握手连接:

第一次握手:客户端发送SYN包(SYN = 1)到服务器,随机生成Sequence number = X,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到SYN包,必须确认客户的SYN(SYN = 1),同时自己也发送一个ACK包(ACK = X+1),即SYN+ACK包,同时随机生成一个Sequence number = Y,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN + ACK包,向服务器发送确认包ACK(ACK = Y+1),同时随机生成一个Sequence number = Z,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

其中握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。

2. TCP的四次挥手断开连接

第一次挥手:主动方发送FIN + ACK包到被动方,随机生成Sequence number = X,并进入FIN_WAIT_1状态,等待被动方确认;

第二次挥手:被动方接收到主动方的FIN + ACK包后,并返回ACK(ACK = X + 1)包,并随机生成Sequence number = Z发送给主动方,并进入CLOSE_WAIT状态,此时主动方接收到信息后随即进入FIN_WAIT_2状态;

第三次挥手:被动方发送FIN+ACK(ack = X + 1)包给主动方,并随机生成Sequence number = Y,并进入LAST_ACK状态;

第四次挥手:主动方接收到被动方的FIN+ACK包以后,向被动方发送ACK(ack = Y+1)包,随即自身进入TIME_WAIT状态,被动方接收到ACK包后进入CLOSED状态,紧接着主动方等待2MSL后也进入CLOSED状态,至此连接断开。

 

 

UDP

UDP(User Datagram Protocol)用户数据报协议,它在OSI模型的传输层,OSI模型的传输层有UDP协议,TCP协议和刚开发出来的一种新的协议SCTP。如果网络中两个主机上的应用程序要相互通信,其一要知道彼此主机的IP,其二要知道主机中运行程序可监听的端口。因为同一主机上的程序使用网络是通过端口号来区分的。因此为了使用UDP,我们需要一对套接字地址:客户端套接字地址和服务器套接字地址。

UDP提供无连接服务。客户端向服务端发送数据时不必先建立连接。客户端创建一个套接字并向服务器发送一个数据报,然后客户端可以立即用这个套接字向另外一个服务器发送其它数据。不能确保UDP数据报最终到达目的地。UDP对接收的数据报不发生确认,发送端不知道数据是否被正确接收,也不会重发数据。UDP传输数据较TCP快,占用系统资源少。

TCP和UDP的区别

1. TCP是面向链接的,虽然说网络的不安全不稳定特性决定了多少次握手都不能保证连接的可靠性,但TCP的三次握手在最低限度上(实际上也很大程度上保证了)保证了连接的可靠性。而UDP不是面向连接的,UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,当然也不用重发,所以说UDP是无连接的、不可靠的一种数据传输协议。

2. 也正由于1所说的特点,使得UDP的开销更小数据传输速率更高,因为不必进行收发数据的确认,所以UDP的实时性更好。知道了TCP和UDP的区别,就不难理解为何采用TCP传输协议的MSN比采用UDP的QQ传输文件慢了,但并不能说QQ的通信是不安全的,因为程序员可以手动对UDP的数据收发进行验证,比如发送方对每个数据包进行编号然后由接收方进行验证啊什么的,即使是这样,UDP因为在底层协议的封装上没有采用类似TCP的“三次握手”而实现了TCP所无法达到的传输效率。

3. 人们通常用电话连线来说明TCP协议,而UDP协议,则常常用邮递来做比喻。

 

TCP

UDP

是否连接

面向连接

面向非连接

传输可靠性

可靠

不可靠

应用场合

传输大量数据

少量数据

速度

转载于:https://www.cnblogs.com/ChenZhongzhou/p/5804672.html

你可能感兴趣的文章
IPv6新形势下的安全解决方案
查看>>
红帽论坛北京站召开 设立亚太开放创新实验室
查看>>
函数式编程语言时代已经来临
查看>>
微软云数据库 Azure SQL DB Hyperscale如何实现超大规模存储和高可用?
查看>>
十年中文技术社区风雨之路 今晚4位老炮畅聊过去未来
查看>>
微软发起Java on Azure调查,呼吁Java社区积极参与
查看>>
SignalR Core尝鲜
查看>>
举重若轻的人人车移动端数据平台
查看>>
Swift 4.1增强了泛型、编译器和包管理器
查看>>
太多脚本将会毁掉持续交付
查看>>
应用性能监控方法一览
查看>>
宕机的阿里云们正在杀死运维?
查看>>
解密新一代Java JIT编译器Graal
查看>>
从数据中心基础设施的视角来看 Facebook 机器学习的应用
查看>>
座谈会:Apache基金会那些事儿
查看>>
如何在 Kubernetes 中对无状态应用进行分批发布
查看>>
Oracle计划新的移动OpenJDK项目
查看>>
Phantom.js维护者退出,项目的未来成疑
查看>>
Datical为数据库添加持续交付能力
查看>>
当中台遇上DDD,我们该如何设计微服务?
查看>>