TCP和UDP的区别和优缺点
一、TCP与UDP区别总结:
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即(ji)发送(song)数据(ju)之前(qian)不需(xu)要建立连接
2、TCP提供可靠的服务。也就是说(shuo),通过(guo)TCP连接传送的数据,无差(cha)错,不(bu)丢(diu)失,不(bu)重复,且(qie)按序到达;UDP尽最大努力交(jiao)(jiao)付,即不(bu)保证可靠交(jiao)(jiao)付
Tcp通过校(xiao)验和(he),重(zhong)传控制(zhi),序号标识,滑(hua)动(dong)窗口、确认应答(da)实现可靠传输。如丢(diu)包(bao)时的重(zhong)发控制(zhi),还可以对次序乱掉的分包(bao)进行顺(shun)序控制(zhi)。
3、UDP具有较好的实(shi)时性,工作效率比TCP高,适用于对高速传输和(he)实(shi)时性有较高的通(tong)信(xin)或广(guang)播通(tong)信(xin)。
4.每一(yi)条TCP连接只能是点到点的(de)(de);UDP支持一(yi)对(dui)一(yi),一(yi)对(dui)多(duo),多(duo)对(dui)一(yi)和(he)多(duo)对(dui)多(duo)的(de)(de)交互(hu)通信
5、TCP对系统资源(yuan)要求较多(duo),UDP对系统资源(yuan)要求较少。
二、为什么UDP有时比TCP更有优势?
UDP以其简(jian)单、传(chuan)输快的(de)优(you)势(shi),在越来(lai)越多(duo)场景(jing)下取代了(le)TCP,如实时游戏。
(1)网速(su)的(de)提(ti)升给(ji)UDP的(de)稳定性提(ti)供(gong)可靠(kao)网络保障(zhang),丢(diu)包率很低(di),如(ru)果使用应用层重传,能(neng)够(gou)确保传输的(de)可靠(kao)性。
(2)TCP为了实现网(wang)络(luo)通(tong)信的可靠性,使用(yong)了复杂的拥塞控制算法,建(jian)立了繁琐的握(wo)手过程,由(you)于TCP内置的系统协议栈中,极(ji)难(nan)对其进行改进。
采用(yong)(yong)TCP,一(yi)旦发生丢包,TCP会(hui)将(jiang)后(hou)续(xu)的包缓存(cun)起(qi)来,等(deng)前面的包重(zhong)传并接收到(dao)后(hou)再继续(xu)发送,延时会(hui)越(yue)来越(yue)大,基于UDP对(dui)实时性要求较为严格的情(qing)况下,采用(yong)(yong)自(zi)定义重(zhong)传机制,能够把(ba)丢包产生的延迟(chi)降到(dao)最低,尽量减少网络问题对(dui)游戏性造(zao)成影(ying)响。
三、UDP和TCP编程步骤也有些不同,如下:
TCP:
TCP编(bian)程的服务器端一般步骤是(shi):
1、创建(jian)一个socket,用函数(shu)socket(); SOCKET SocketListen =socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);
2、设置socket属性,用函数setsockopt(); * 可选
3、绑定IP地址(zhi)、端(duan)口(kou)等信息到socket上,用函(han)数bind(); SOCKET_ERROR = bind(SocketListen,(const sockaddr*)&addr,sizeof(addr))
4、开启监(jian)听,用函数listen(); SOCKET_ERROR == listen(SocketListen,2)
5、接收客户端(duan)上来的连接,用函数(shu)accept(); SOCKET SocketWaiter = accept(SocketListen,
_Out_ struct sockaddr *addr
_Inout_ int *addrlen);
6、收(shou)发数(shu)(shu)据(ju),用函数(shu)(shu)send()和(he)(he)recv(),或者read()和(he)(he)write();
7、关闭网(wang)络连(lian)接; closesocket(SocketListen);closesocket(SocketWaiter);
8、关闭监听;
SOCK_STREAM这种(zhong)(zhong)的特点是面向连接的,即每(mei)次收发(fa)数据之(zhi)前必(bi)须通(tong)过connect建(jian)立连接,而(er)SOCK_DGRAM这种(zhong)(zhong)是User Datagram Protocol协议的网络通(tong)讯,它是无连接的,不可靠的。
TCP编程的客户端一般步骤是:
1、创建一个socket,用函数(shu)socket();
2、设置socket属(shu)性,用(yong)函数setsockopt();* 可选(xuan)
3、绑定(ding)IP地(di)址、端(duan)口(kou)等(deng)信(xin)息(xi)到socket上,用函数bind();* 可选
4、设置要连接的(de)对方的(de)IP地(di)址和端口等(deng)属性(xing);
5、连接服务器,用函数connect();
6、收发数据,用函数send()和(he)recv(),或者read()和(he)write();
7、关闭网(wang)络连接(jie);
int send(
_In_ SOCKET s, //向哪(na)个socket发送,accept返回的socket。
_In_ const char *buf,
_In_ int len,
_In_ int flags
); 由(you)于
send(SocketClient,(const char *)&fh,sizeof(fh),0);
recv(SocketClient,szbuf,sizeof(szbuf),0);
UDP:
与(yu)之对应的UDP编程步(bu)骤要简单许(xu)多,分别如下:
UDP编(bian)程的服务器端(duan)一般步骤是:
1、创建一(yi)个socket,用(yong)函数(shu)socket();
2、设置socket属(shu)性,用函(han)数setsockopt();* 可选(xuan)
3、绑定IP地址、端口等信(xin)息到socket上,用函数bind();
4、循环接收(shou)数(shu)据,用函数(shu)recvfrom();
5、关闭网络连接;
UDP编(bian)程(cheng)的客户端一般步(bu)骤是:
1、创建一个socket,用函数(shu)socket();
2、设置(zhi)socket属性,用函(han)数setsockopt();* 可(ke)选
3、绑定IP地址、端口等信息到(dao)socket上,用函数(shu)bind();* 可选
4、设置对方的IP地址和端口等属性;
5、发送数据,用函数sendto();
6、关闭(bi)网络连接(jie);
int recvfrom(
_In_ SOCKET s, //绑定(ding)的socket
_Out_ char *buf,
_In_ int len,
_In_ int flags,
_Out_ struct sockaddr *from, //用来接收(shou)对方的
_Inout_opt_ int *fromlen
);
int nres=recvfrom(pThis->m_socketListen,szBuf,sizeof(szBuf),0,(sockaddr*)&addrClient,&nSize);//0处标(biao)志(zhi)位
sendto(m_socketListen,szBuffer,nSize,0,(const sockaddr*)&addr,sizeof(sockaddr_in))
TCP和UDP是OSI模(mo)型中的运输(shu)层中的协议(yi)。TCP提供(gong)可靠的通(tong)信(xin)传输(shu),而UDP则常被用于让(rang)广播(bo)和细(xi)节控制交(jiao)给应用的通(tong)信(xin)传输(shu)。
4、将(jiang)socket设置(zhi)为广播属(shu)性
bool optval=true;
setsockopt(m_socketListen,SOL_SOCKET,SO_BROADCAST,(const char *)&optval,sizeof(bool));
5、将Socket设(she)置(zhi)为非阻(zu)塞。
//bool benable=true;
//ioctlsocket(m_socketListen,FIONBIO,(u_long*)&benable);
6、Tcp头,20字(zi)节
7、UDP首部(bu),8个字节