(二十七)TCP和UDP,TCP连接和断开服务器

一、TCP和UDP的区别

 TCP(Transmission Control Protocol)可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。使用TCP的应用:Web浏览器;文件传输程序。

  UDP(User Datagram Protocol)不可靠的、无连接的服务,传输效率高(发送前时延小),一对一、一对多、多对一、多对多、面向报文(数据包),尽最大努力服务,无拥塞控制。使用UDP的应用:域名系统 (DNS);视频流;IP语音(VoIP)。

通过图看一下,两者的区别:

继续往下看,TCP和UDP下socket差异对比图:

  上面的图只是让大家感受一下TCP和UDP协议下,socket工作流程的不同,两者之间的差异是tcp需要连接,udp不需要。

二、TCP连接的三次握手和四次挥手

  1. 三次握手:
  2. TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态;
  3. TCP客户进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这是报文首部中的同部位SYN=1,同时选择一个初始序列号 seq=x ,此时,TCP客户端进程进入了 SYN-SENT(同步已发送状态)状态。TCP规定,SYN报文段(SYN=1的报文段)不能携带数据,但需要消耗掉一个序号。
  4. TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了SYN-RCVD(同步收到)状态。这个报文也不能携带数据,但是同样要消耗一个序号。
  5. TCP客户进程收到确认后,还要向服务器给出确认。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1,此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号。
  6. 当服务器收到客户端的确认后也进入ESTABLISHED状态,此后双方就可以开始通信了。

通俗来讲:

1.客户端要请求网络数据,所以要跟服务端建立通道,会带着一些参数传递到服务端。

2.服务端接到,客户端传递过来的请求后,要告诉一下客户端,让客户端知道,我已接到你的请求。客户端接到了,服务端传递过来的消息,知道服务端已经接收到自己传递过去的请求。

3.客户端还要告诉一下服务端,让服务端知道,你给我的回信我收到了,接下来,咱俩就开始传输数据吧。

四次挥手:

  数据传输完毕后,双方都可释放连接。最开始的时候,客户端和服务器都是处于ESTABLISHED状态,然后客户端主动关闭,服务器被动关闭。服务端也可以主动关闭,一个流程。

1、客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。

2、服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。

3、客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。

4、服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。

5、客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2??MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。

6、服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

原文地址:https://www.cnblogs.com/asia-yang/p/10217083.html

时间: 2024-10-09 10:59:53

(二十七)TCP和UDP,TCP连接和断开服务器的相关文章

TCP和UDP比較

一.TCP/IP协议 TCP/IP协议,你一定常常听说吧,当中TCP(Transmission Control Protocol)称为传输控制协议,IP(Internet Protocol)称为因特网互联协议. 事实上TCP/IP协议,是一个协议簇,就是一大堆协议的集合. 这一大套协议定义了整个互联网通信的基础,比方一次网络链接要经过哪些步骤,一块传输数据过程中应该怎样解释,这块数据该怎样展示给编程者等等问题. 举个样例:就好比小时候玩过家家的游戏.谁负责当爸.谁负责当妈,谁负责当儿子,都有明白

tcp和udp

多网卡 1 机器跨网段 2 网卡绑定 TCP和UDP tcp基于链接通信1 基于链接,则需要listen(backlog),指定连接池的大小2 基于链接,必须先运行服务端,然后客户端发起链接请求3 对于mac系统:如果一端断开了链接,那另外一端的链接也跟着完蛋recv将不会阻塞,收到的是空(解决方法是:服务端在收消息后加上if,空消息就break掉通信循环)4 对于windows/linux系统:如果一端断开了链接,那另外一端的链接也跟着完蛋recv将不会阻塞,收到的是空,异常(解决方法是:服务

图解 TCP/IP 第六章 TCP与UDP 笔记6.1 传输层的作用

?图解?TCP/IP? 第六章?TCP与UDP? ?笔记6.1 传输层的作用 ? 传输层必须指出这个具体的程序,为了实现这一功能,使用端口号这样一种识别码.根据端口号,就可以识别在传输层上一层的应用程序所有进行处理的具体程序. ? 6.1.1 传输层定义 6.1.2 通信处理 ? 6.1.3 两种传输层协议 TCP和UDP TCP 是面向连接的.可靠的流协议.流就是指不间断的数据结构,你可以把它想象成排水管道中的水流. UDP 是不具有可靠性的数据包协议 .细微的处理会交给上层的应用去完成.在U

java——TCP和UDP

在现有的网络中通讯方式协议有两种:TCP和UDP TCP 是专门设计用于不可靠的的因特网上提供可靠的.端到端的字节流通信的协议,它是一种面向连接的协议,TCP连接是字节流而非报文流. TCP协议就像打电话一样,接通以后有讲话有应答. UDP 向应用程序提供了一种发送封装的原始IP数据报的方法.并且发送时无需建立连接,是一种不可靠的连接. UDP协议就像发电报一样,发出去后就不在去考虑对方收到没有收到. 根据TCP/IP的模式图可以看出这两种协议的关系. socket socket在TCP/IP的

小白日记9:kali渗透测试之主动信息收集(二)四层发现:TCP、UDP、nmap、hping、scapy

四层发现 四层发现的目的是扫描出可能存活的IP地址,四层发现虽然涉及端口扫描,但是并不对端口的状态进行精确判断,其本质是利用四层协议的一些通信来识别主机ip是否存在. 四层发现的优点: 1.可路由且结果可靠: 2.不太可能被防火墙过滤,甚至可以发现所有端口都被过滤的主机.[一些比较严格的防火墙还是会过滤掉]   缺点:是基于状态过滤的防火墙可能过滤扫描:全端口(UDP+TCP十几万个端口)扫描的速度慢. 一.TCP探测[基于特征] tcp连接是通过三次握手建立通信过程. 1.未经请求的ACK[直

socket 网络编程快速入门(二)教你编写基于UDP/TCP的服务端多线程通信

在上一篇博文中,我们介绍了利用socket进行简单的UDP/TCP的服务端和客户端的通信. (一) 在基于UDP的程序中,你有没有想过,如果我的这台主机在通讯的时候要求既能够收到别的主机发来的数据,又能够自己向目的主机发出数据,该怎样实现?也就是说需要两个while循环同时进行.答案是使用多线程,一个线程用于接受数据,另一个线程用来发送数据.接下来我们介绍WinSock的多线程编程. 多线程的实现我们使用_beginthread()函数: uintptr_t _beginthread( void

运用JAVA的concurrent.ExecutorService线程池实现socket的TCP和UDP连接

运用JAVA的concurrent.ExecutorService线程池实现socket的TCP和UDP连接 最近在项目中可能要用到socket相关的东西来发送消息,所以初步研究了下socket的TCP和UDP实现方式,并且结合java1.5的concurrent.ExecutorService类来实现多线程. 具体实现方式见代码: 一.TCP方式: 1.服务端实现方式: TCP的服务端实现方式主要用到ServerSocket类,接收等待客户端连接的方法是accept(); 代码如下:类Sock

网络应用(二)----安卓如何使用TCP和UDP进行通信,Socket编程

TCP传输控制协议,是一种面向连接的,可靠的,基于字节流的传输层通信协议. UDP用户数据报协议,是TCP/IP模型中一种面向无连接的传输层协议,提供面向事务的简单不可靠信息传送服务. Socket通称套接字,中文意思为插座.一台服务器可能会提供很多服务,每种服务对应一个Socket(也可说成,每个Socket就是一个插座,客户若是需要哪种服务,就将插头插到相应的插座上面).而客户的插头也是一个Socket.它是应用层与TCP/IP协议通信的中间软件抽象层,是一组接口. Socket基本操作包括

tcp/udp建立连接并通信的过程

基于TCP的socket编程的服务器程序流程如下: 1.创建套接字 SOCKETsockSrv = socket(AF_INET, SOCK_STREAM, 0) ; 2.将套接字绑定到本地地址和端口上 SOCKADDR_INaddrSrv ; addrSrv.sin_addr.S_un.S_addr =htonl(INADDR_ANY) ;                   //把一个u_long类型的值转化为网络字节顺序 addrSrv.sin_family = AF_INET ; add