1.前言
TCP和UDP是两种最重要的传输协议,也是应用最广泛的传输协议,想要做服务器,就必须要学习和了解这两种传输协议,这里厚着脸皮从别人博主这里扒下来的知识点,先感谢一下这两个博主的分享。其实TCP和UDP拿出任何一个协议来讲都是需要长篇大论的,因为我们是由浅入深的学习,等碰到问题再去针对性的学习,所以这里只讲一下基本的概念,只要知道个大概就足够了。本文引用了下面链接中的内容。
2.TCP和UPD
①TCP
TCP也就是传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
基于流的方式(字节流的传输方式)
面向连接(数据传输的时候要先建立链接)
可靠的通信方式(严格按照顺序传输,不会丢包)
复杂的数据包
②UDP
UDP 也就是用户数据报协议(UDP,User Datagram Protocol)是一种支持无连接的传输协议,UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。吞吐量不受协议控制(传输的速度只受应用,带宽,性能控制)
无连接的协议(传输数据,源端和终端不需要建立连接)
无需维护状态,不可靠的协议(只管发送,不管是否能接受,是否掉包,是否送达)
数据包小(数据包只有8个字节,相对于TCP的20个字节来说,节约了很多没必要的开销)
三.TCP的应用
我们准备写的是基于TCP协议服务器,这里重点讲一下TCP的数据传输流程
①TCP的连接
TCP是一种面向连接的,可靠的基于字节流的通信协议,数据的传输要建立在连接的基础上,传输完成后还要断开连接。
客户端在接受数据钱要使用connetct()函数和服务器建立连接。建立连接的目的是保证IP地址,端口,物理链路正确无误,为数据的传输开辟通道。
TCP的建立连接要传输三个数据包,俗称三次握手。
②TCP的数据报
序号:Seq(Sequence Number)序号占32位,用来标识从计算机A发送到计算机B的数据包序号,计算机发送数据时对此做出标记。
确认号:Ack(Acknowledge Number)确认号占32位,客户端和服务器都可以发送,Ack = Seq+1。
标志号:每个标志号占1位,一共有6个。
URG:紧急指针(urgent pointer)有效
ACK:确认需要有效
PSH:接收方应该尽快将这个保温交给应用层
SYN:建立一个新的连接
SIN:断开一个连接。
③TCP的三次握手
首先client端发送连接请求报文;server端接收到连接后回复ACK报文,并为这次连接分配资源;Client端接收到ACK报文后也向Server段发送ACK报文,并分配资源,这样TCP连接就建立好了。
④TCP的四次挥手
第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
第二次挥手:Server收到FUIIN后,发送一个ACK给Client,Server进入CLOSE_WAIT状态。
第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,发送ACK给Server,Server进入CLOSED状态,完成第四次挥手。
⑤为什么连接用3次握手,关闭却要用4次挥手?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
四.小结
只有知道了TCP和UDP的区别,才能更进一步的了解Socket的几个函数和参数的含义。只有多花一些时间去深入理解网络传输的流程和常用的协议,我们才能更好的开发出可靠的,高性能的网络服务器。