您现在的位置: 365建站网 > 365学习 > TCP、UDP以及HTTP的用法和区别

TCP、UDP以及HTTP的用法和区别

文章来源:365jz.com     点击数:255    更新时间:2018-10-19 09:28   参与评论

先来一个讲TCP、UDP和HTTP关系的

1、TCP/IP是个协议组,可分为三个层次:网络层、传输层和应用层。
在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。
在传输层中有TCP协议与UDP协议。
在应用层有FTP、HTTP、TELNET、SMTP、DNS等协议。
因此,HTTP本身就是一个协议,是从Web服务器传输超文本到本地浏览器的传送协议。

 

TCP 是基于 TCP 协议实现的网络文本协议,属于传输层。
UDP 是和TCP 对等的,属于传输层,UDP 和 TCP 有重要的区别。

 

2、HTTP协议是建立在请求/响应模型上的。首先由客户建立一条与服务器的TCP链接,并发送一个请求到服务器,请求中包含请求方法、URI、协议版本以及相关的MIME样式的消息。服务器响应一个状态行,包含消息的协议版本、一个成功和失败码以及相关的MIME式样的消息。
HTTP/1.0为每一次HTTP的请求/响应建立一条新的TCP链接,因此一个包含HTML内容和图片的页面将需要建立多次的短期的TCP链接。一次TCP链接的建立将需要3次握手。
另外,为了获得适当的传输速度,则需要TCP花费额外的回路链接时间(RTT)。每一次链接的建立需要这种经常性的开销,而其并不带有实际有用的数据,只是保证链接的可靠性,因此HTTP/1.1提出了可持续链接的实现方法。HTTP/1.1将只建立一次TCP的链接而重复地使用它传输一系列的请求/响应消息,因此减少了链接建立的次数和经常性的链接开销。

这里有必要再讲一下三次握手的过程:

 

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

 

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;ACK:确认字符(Acknowledgement)

 

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

 

 

3、结论:虽然HTTP本身是一个协议,但其最终还是基于TCP的。不过,目前,有人正在研究基于TCP+UDP混合的HTTP协议。

Socket是什么呢?
       Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。


 

 

TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,我们这里只做简单、形象的介绍,你只要做到能够理解这个过程即可。我们来看看这三次对话的简单过程:主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”,这是第二次对话;主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。 

UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去! 
  UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。比如,我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。例如,在默认状态下,一次“ping”操作发送4个数据包(如图2所示)。大家可以看到,发送的数据包数量是4包,收到的也是4包(因为对方主机收到后会发回一个确认收到的数据包)。这充分说明了UDP协议是面向非连接的协议,没有建立连接的过程。正因为UDP协议没有连接的过程,所以它的通信效果高;但也正因为如此,它的可靠性不如TCP协议高。QQ就使用UDP发消息,因此有时会出现收不到消息的情况。 

tcp协议和udp协议的差别 
             TCP       UDP 
是否连接     面向连接   面向非连接 
传输可靠性     可靠      不可靠 
应用场合    传输大量数据  少量数据 
速度          慢          快


一、TCP与UDP区别总结:

1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接

2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付


Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。


3、UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。


4.每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信


5、TCP对系统资源要求较多,UDP对系统资源要求较少。


二、为什么UDP有时比TCP更有优势?


UDP以其简单、传输快的优势,在越来越多场景下取代了TCP,如实时游戏。


(1)网速的提升给UDP的稳定性提供可靠网络保障,丢包率很低,如果使用应用层重传,能够确保传输的可靠性。


(2)TCP为了实现网络通信的可靠性,使用了复杂的拥塞控制算法,建立了繁琐的握手过程,由于TCP内置的系统协议栈中,极难对其进行改进。


采用TCP,一旦发生丢包,TCP会将后续的包缓存起来,等前面的包重传并接收到后再继续发送,延时会越来越大,基于UDP对实时性要求较为严格的情况下,采用自定义重传机制,能够把丢包产生的延迟降到最低,尽量减少网络问题对游戏性造成影响。



三、UDP和TCP编程步骤也有些不同,如下:


TCP: 

TCP编程的服务器端一般步骤是: 

  1、创建一个socket,用函数socket();

            SOCKET SocketListen =socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);

  2、设置socket属性,用函数setsockopt(); * 可选 

  3、绑定IP地址、端口等信息到socket上,用函数bind(); 

            SOCKET_ERROR = bind(SocketListen,(const sockaddr*)&addr,sizeof(addr))

  4、开启监听,用函数listen();

            SOCKET_ERROR == listen(SocketListen,2)

  5、接收客户端上来的连接,用函数accept();

            SOCKET SocketWaiter = accept(SocketListen,

            _Out_    struct sockaddr *addr

            _Inout_  int *addrlen);

  6、收发数据,用函数send()和recv(),或者read()和write(); 

  7、关闭网络连接; 

            closesocket(SocketListen);closesocket(SocketWaiter);

  8、关闭监听; 

SOCK_STREAM这种的特点是面向连接的,即每次收发数据之前必须通过connect建立连接,而SOCK_DGRAM这种是User Datagram Protocol协议的网络通讯,它是无连接的,不可靠的。

TCP编程的客户端一般步骤是: 

  1、创建一个socket,用函数socket(); 

  2、设置socket属性,用函数setsockopt();* 可选 

  3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选 

  4、设置要连接的对方的IP地址和端口等属性; 

  5、连接服务器,用函数connect(); 

  6、收发数据,用函数send()和recv(),或者read()和write(); 

  7、关闭网络连接;


int send(

  _In_  SOCKET s,         //向哪个socket发送,accept返回的socket。

  _In_  const char *buf,

  _In_  int len,

  _In_  int flags

);                               由于

send(SocketClient,(const char *)&fh,sizeof(fh),0);

recv(SocketClient,szbuf,sizeof(szbuf),0);

UDP:

与之对应的UDP编程步骤要简单许多,分别如下: 

  UDP编程的服务器端一般步骤是: 

  1、创建一个socket,用函数socket(); 

  2、设置socket属性,用函数setsockopt();* 可选 

  3、绑定IP地址、端口等信息到socket上,用函数bind(); 

  4、循环接收数据,用函数recvfrom(); 

  5、关闭网络连接; 


UDP编程的客户端一般步骤是: 

  1、创建一个socket,用函数socket(); 

  2、设置socket属性,用函数setsockopt();* 可选 

  3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选 

  4、设置对方的IP地址和端口等属性; 

  5、发送数据,用函数sendto(); 

  6、关闭网络连接;



int recvfrom(

  _In_         SOCKET s,       //绑定的socket

  _Out_        char *buf,

  _In_         int len,

  _In_         int flags,

  _Out_        struct sockaddr *from,  //用来接收对方的

  _Inout_opt_  int *fromlen

);

int nres=recvfrom(pThis->m_socketListen,szBuf,sizeof(szBuf),0,(sockaddr*)&addrClient,&nSize);//0处标志位

sendto(m_socketListen,szBuffer,nSize,0,(const sockaddr*)&addr,sizeof(sockaddr_in))

TCP和UDP是OSI模型中的运输层中的协议。TCP提供可靠的通信传输,而UDP则常被用于让广播和细节控制交给应用的通信传输。


四、将socket设置为广播属性

bool optval=true;

setsockopt(m_socketListen,SOL_SOCKET,SO_BROADCAST,(const char *)&optval,sizeof(bool));


五、将Socket设置为非阻塞。

//bool benable=true;

//ioctlsocket(m_socketListen,FIONBIO,(u_long*)&benable);


6、Tcp头,20字节


7、UDP首部,8个字节

如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛


发表评论 (255人查看0条评论)
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码: 点击我更换图片
最新评论
------分隔线----------------------------