网络编程之_TCP协议和UDP协议
TCP协议和UDP协议【1】TCP协议TCPTransmission Control Protocol传输控制协议是一种面向连接的、可靠的、基于字节流的通信协议数据在传输前要建立连接传输完毕后还要断开连接。客户端在收发数据前要使用 connect() 函数和服务器建立连接。建立连接的目的是保证IP地址、端口、物理链路等正确无误为数据的传输开辟通道。序号SeqSequence Number序号占32位用来标识从计算机A发送到计算机B的数据包的序号计算机发送数据时对此进行标记。确认号AckNumber确认号占32位客户端和服务器端都可以发送Ack Seq 1。标志位每个标志位占用1Bit共有6个分别为 URG、ACK、PSH、RST、SYN、FIN具体含义如下// URG紧急指针urgent pointer有效。// ACK确认序号有效。// PSH接收方应该尽快将这个报文交给应用层。// RST重置连接。// SYN建立一个新连接。// FIN断开一个连接。TCP建立连接时要传输三个数据包俗称三次握手Three-way Handshaking。可以形象的比喻为下面的对话[Shake 1] 套接字A“大哥你能听到我说话吗”[Shake 2] 套接字B“可以小弟你能听到我说话吗”[Shake 3] 套接字A“我也能OK”使用 connect() 建立连接时客户端和服务器端会相互发送三个数据包请看下图客户端调用 socket() 创建套接字后因为没有建立连接所以套接字处于CLOSED状态服务器端调用 listen() 函数后套接字进入LISTEN状态开始监听客户端请求。这个时候客户端开始发起请求当客户端调用 connect() 函数后TCP协议会组建一个数据包并设置 SYN 标志位表示该数据包是用来建立同步连接的。同时生成一个随机数字 1000填充“序号Seq”字段表示该数据包的序号。完成这些工作开始向服务器端发送数据包客户端就进入了SYN-SEND状态。服务器端收到数据包检测到已经设置了 SYN 标志位就知道这是客户端发来的建立连接的“请求包”。服务器端也会组建一个数据包并设置 SYN 和 ACK 标志位SYN 表示该数据包用来建立连接ACK 用来确认收到了刚才客户端发送的数据包。 服务器生成一个随机数 2000填充“序号Seq”字段。2000 和客户端数据包没有关系。服务器将客户端数据包序号1000加1得到1001并用这个数字填充“确认号Ack”字段。服务器将数据包发出进入SYN-RECV状态。客户端收到数据包检测到已经设置了 SYN 和 ACK 标志位就知道这是服务器发来的“确认包”。客户端会检测“确认号Ack”字段看它的值是否为 10001如果是就说明连接建立成功。接下来客户端会继续组建数据包并设置 ACK 标志位表示客户端正确接收了服务器发来的“确认包”。同时将刚才服务器发来的数据包序号2000加1得到 2001并用这个数字来填充“确认Ack”字段。客户端将数据包发出进入ESTABLISED状态表示连接已经成功建立。服务器端收到数据包检测到已经设置了 ACK 标志位就知道这是客户端发来的“确认包”。服务器会检测“确认号Ack”字段看它的值是否为 20001如果是就说明连接建立成功服务器进入ESTABLISED状态。至此客户端和服务器都进入了ESTABLISED状态连接建立成功接下来就可以收发数据了。注意三次握手的关键是要确认对方收到了自己的数据包这个目标就是通过“确认号Ack”字段实现的。计算机会记录下自己发送的数据包序号 Seq待收到对方的数据包后检测“确认号Ack”字段看Ack Seq 1是否成立如果成立说明对方正确收到了自己的数据包【2】UDP协议TCP 是面向连接的传输协议建立连接时要经过三次握手断开连接时要经过四次握手中间传输数据时也要回复 ACK 包确认多种机制保证了数据能够正确到达不会丢失或出错。UDP 是非连接的传输协议没有建立连接和断开连接的过程它只是简单地把数据丢到网络中也不需要 ACK 包确认。UDP 传输数据就好像我们邮寄包裹邮寄前需要填好寄件人和收件人地址之后送到快递公司即可但包裹是否正确送达、是否损坏我们无法得知也无法保证。UDP 协议也是如此它只管把数据包发送到网络然后就不管了如果数据丢失或损坏发送端是无法知道的当然也不会重发。既然如此TCP 应该是更加优质的传输协议吧如果只考虑可靠性TCP 的确比 UDP 好。但 UDP 在结构上比 TCP 更加简洁不会发送 ACK 的应答消息也不会给数据包分配 Seq 序号所以 UDP 的传输效率有时会比 TCP 高出很多编程中实现 UDP 也比 TCP 简单。UDP 的可靠性虽然比不上TCP但也不会像想象中那么频繁地发生数据损毁在更加重视传输效率而非可靠性的情况下UDP 是一种很好的选择。比如视频通信或音频通信就非常适合采用 UDP 协议通信时数据必须高效传输才不会产生“卡顿”现象用户体验才更加流畅如果丢失几个数据包视频画面可能会出现“雪花”音频可能会夹带一些杂音这些都是无妨的。与 UDP 相比TCP 的生命在于流控制这保证了数据传输的正确性。