TCP可靠性,TCP建立连接和断开连接的过程

TCP保证可靠性

序列号、确认应答、超时重传

数据到达接收方,接收方需要发出一个确认应答,表示已经收到该数据段,并且确认序号会说明了它下一次需要接收的数据序列号。如果发送发迟迟未收到确认应答,那么可能是发送的数据丢失,也可能是确认应答丢失,这时发送方在等待一定时间后会进行重传。 这个时间一般是2*RTT (报文段往返时间) +一个偏差值。

窗口控制与高速重发控制/快速重传(重复确认应答)

TCP会利用窗口控制来提高传输速度,意思是在一个窗口大小内,不用一定要等到应答才能发送下一段数据,窗口大小就是无需等待确认而可以继续发送数据的最大值。如果不使用窗口控制,每一个没收到确认应答的数据都要重发。
使用窗口控制,如果数据段1001 -2000丢失,后面数据每次传输,确认应答都会不停地发送序号为1001的应答,表示我要接收1001开始的数据,发送端如果收到3次相同应答,就会立刻进行重发;但还有种情况有可能是数据都收到了,但是有的应答丢失了,这种情况不会进行重发,
因为发送端知道,如果是数据段丢失,接收端不会放过它的,会疯狂向它提醒.

拥塞控制

如果把窗口定的很大,发送端连续发送大量的数据,可能会造成网络的拥堵(大家都在用网,你在这狂发,吞吐量就那么大,当然会堵),甚至造成网络的瘫痪。所以TCP在为了防止这种情况而进行了拥塞控制。
慢启动:定义拥塞窗口,一开始将该窗口大小设为1,之后每次收到确认应答(经过一个 rtt), 将拥塞窗口大小*2。
拥塞避免:设置慢启动阈值,一般开始都设为65536。拥塞避免是指当拥塞窗口大小达到这个阈值,拥塞窗口的值不再指数上升,而是加法增加(每次确认应答/每个rtt,拥塞窗口大小+1),以此来避免拥塞。
将报文段的超时重传看做拥塞,则一.旦发生超时重传,我们需要先将阈值设为当前窗口大小的一半,并且将窗口大小设为初值1,然后重新进入慢启动过程。
快速重传:在遇到3次重复确认应答(高速重发控制)时,代表收到了3个报文段,但是这之前的1个段丢失了,便对它进行立即重传。
然后,先将阈值设为当前窗口大小的一半,然后将拥塞窗口大小设为慢启动阈值+3的大小。这样可以达到:在TCP通信时,网络吞吐量呈现逐渐的上升,并且随着拥堵来降低吞吐量,再进入慢慢上升的过程,网络不会轻易的发生瘫痪。
TCP建立连接和断开连接的过程:
image.png

三次握手

TCP的三次握手过程如下:
C-> SYN-> S
S->SYN/ACK->C
C->ACK->S

  1. Client将标志位SYN置为1,随机产生一个值 seq=J, 并将该数据包发送给Server,Client进入SYN_ SENT 状态,等待Server确认。
  2. Server 收到数据包后由标志位SYN=1知道Client请求建立连接,Server 将标志位SYN和ACK都置为1,ack=J+1, 随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server 进入SYN_ RCVD 状态。
  3. Client收到确认后,检查ack是否为J+1, ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1, 并将该数据包发送给Server, Server 检查ack是否为K+1, ACK是否为1,如果正确则连接建立成功,Client 和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

三次握手的原因:三次握手可以防止已经失效的连接请求报文突然又传输到服务器端导致的服务器资源浪费。例如,客户端先发送了一个SYN,但是由于网络阻塞,该SYN数据包在某个节点长期滞留。然后客户端又重传SYN数据包并正确建立TCP连接,然后传输完数据后关闭该连接。该连接释放后失效的SYN数据包才到达服务器端。在二次握手的前提下,服务器端会认为这是客户端发起的又一次请求,然后发送SYN,并且在服务器端创建socket套接字,一直等待客户端发送数据。但是由于客户端并没有发起新的请求,所以会丢弃服务端的SYN。此时服务器会一直等待客户端发送数据从而造成资源浪费。

四次挥手

TCP的四次挥手过程如下:
C->FIN->S
S->ACK->C
S->FIN->C
C->ACK->S
由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这-原则是当一 方完成数据发送任务后,发送一个 FIN来终止这一方向的连接, 收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。

  1. 数据传输结束后,客户端的应用进程发出连接释放报文段,并停止发送数据,客户端进入FIN WAIT 1状态,此时客户端依然可以接收服务器发送来的数据。
  2. 服务器接收到FIN后,发送一个ACK给客户端,确认序号为收到的序号+1,服务器进入CLOSE WAIT状态。客户端收到后进入FIN WAIT_ 2状态。
  3. 当服务器没有数据要发送时,服务器发送一个FIN报文,此时服务器进入LAST_ ACK状态,等待客户端的确认
  4. 客户端收到服务器的FIN报文后,给服务器发送一个ACK报文,确认序列号为收到的序号+1。此时客户端进入TIME_ WAIT 状态,等待2MSL (MSL:报文段最大生存时间),然后关闭连接。

四次挥手的原因:由于连接的关闭控制权在应用层,所以被动关闭的一方在接收到FIN包时,TCP协议栈会直接发送-一个ACK确认包,优先关闭一端的通信。然后通知应用层,由应用层决定什么时候发送FIN包。应用层可以使用系统调用函数read==0来判断对端是否关闭连接。

2MSL意义

  1. 保证最后一次握手报文能到B,能进行超时重传。
  2. 2MSL后,这次连接的所有报文都会消失,不会影响下一次连接。

    TCP模及TCP状态转移

    四层TCP/IP模型如下:
    image.png
    其状态转移图如下:
    image.png

    HTTP返回码

    HTTP协议的响应报文由状态行、响应头部和响应包体组成,

    响应状态码总体描述

    1xx:指示信息—表示请求已接收,继续处理。
    2xx:成功—表示请求已被成功接收、理解、接受。
    3xx:重定向—要完成请求必须进行更进一步的操作。
    4xx:客户端错误—请求有语法错误或请求无法实现。
    5xx:服务器端错误—服务器未能实现合法的请求。

    常见状态代码、状态描述的详细说明

    200 0K:客户端请求成功。
    206 partial content 服务器已经正确处理部分GET请求,实现断点续传或同时分片下载,该请求必须包含Range请求头来指示客户端期望得到的范围
    300 multiple choices (可选重定向) :被请求的资源有一系列可供选择的反馈信息,由浏览器/用户自行选择其中一 个。
    301moved permanently (永久重定向) :该资源已被永久移动到新位置,将来任何对该资源的访问都要使用本响应返回的若干个URI之一。
    302 move temporarily (临时重定向):请求的资源现在临时从不同的URI中获得,
    304 not modified :如果客户端发送一个待条件的 GET请求并且该请求以经被允许, 而文档内容未被改变,则返回304,该响应不包含包体(即可直接使用缓存)。
    403 Forbidden: 服务器收到请求,但是拒绝提供服务。
    t Found: 请求资源不存在,举个例子:输入了错误的URL。

    HTTP和HTTPS的区别,以及HTTPS优缺点

    HTTP协议和HTTPS协议区别如下

  3. HTTP协议是以明文的方式在网络中传输数据,而HTTPS协议传输的数据则是经过TLS加密后的,HTTPS 具有更高的安全性。

  4. HTTPS在|TCP三次握手阶段之后,还需要进行SSL的handshake,协商加密使用的对称加密密钥
  5. HTTPS协议需要服务端申请证书,浏览器端安装对应的根证书
  6. HTTP协议端口是80,HTTPS协议端口是443

    HTTPS优点

  7. HTTPS传输数据过程中使用密钥进行加密,所以安全性更高。

  8. HTTPS协议可以认证用户和服务器,确保数据发送到正确的用户和服务器。

HTTPS缺点:

  1. HTTPS握手阶段延时较高:由于在进行HTTP会话之前还需要进行SSL握手,因此HTTPS协议握手阶段延时增加。
  2. HTTPS部署成本高:一方面HTTPS协议需要使用证书来验证自身的安全性,所以需要购买CA证书;另一方面由于采用HTTPS协议需要进行加解密的计算,占用CPU资源较多,需要的服务器配置或数目高。

    GET与POST

  3. GET 请求只能 URL 编码,而 POST 支持多种编码方式

  4. GET 请求只接受 ASCII 字符的参数,而 POST 则没有限制
  5. GET 请求的参数通过 URL 传送,而 POST 放在 Request Body 中
  6. GET 相对于 POST 更不安全,因为参数直接暴露在 URL 中
  7. GET 请求会被浏览器主动缓存,而 POST 不会(除非自己手动设置)
  8. GET 请求在 URL 传参有长度限制,而 POST 则没有限制
  9. GET 产生的 URL 地址可以被收藏,而 POST 不可以
  10. GET 请求的参数会被完整的保留在浏览器的历史记录里,而 POST 的参数则不会
  11. GET 在浏览器回退时是无害的,而 POST 会再次提交请求

    IP地址作用,以及MAC地址作用

    MAC地址是一个硬件地址,用来定义网络设备的位置,主要由数据链路层负责。而IP地址是IP协议提供的一种统一的地址格式,为互联网上的每—个网络和每一-台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。

    操作系统中的中断

    中断是指CPU对系统发生的某个事件做出的一-种反应,CPU暂停正在执行的程序,保存现场后自动去执行相应的处理程序,处理完该事件后再返回中断处继续执行原来的程序。中断一般三类,一种是由CPU外部引起的,如I/0中断、时钟中断,一种是来自CPU内部事件或程序执行中引起的中断,例如程序非法操作,地址越界、浮点溢出),最后一种是在程序中使用了系统调用引起的。而中断处理般分为中断响应和中断处理两个步骤,中断响应由硬件实施,中断处理主要由软件实施。

    OSI七层模型和TCP/IP四层模型,每层列举2个协议

    OSI七层模型及其包含的协议

  12. 物理层:通过媒介传输比特,确定机械及电气规范,传输单位为bit,主要包括的协议为:EE802.3 CLOCK RJ451。

  13. 数据链路层:将比特组装成帧和点到点的传递,传输单位为帧,主要包括的协议为MAC VLAN PP
  14. 网络层:负责数据包从源到宿的传递和网际互连,传输单位为包,主要包括的协议为IP ARP ICMP
  15. 传输层:提供端到端的可靠报文传递和错误恢复,传输单位为报文,主要包括的协议为TCP/UDP
  16. 会话层:建立、管理和终止会话,传输单位为SPDU,主要包括的协议为RPC NFS
  17. 表示层:对数据进行翻译、加密和压缩,传输单位为PPDU,主要包括的协议为JPEG ASII
  18. 应用层:允许访问OSI环境的手段,传输单位为APDU,主要包括的协议为FTP HTTP DNS

    TCP/IP 4层模型

  19. 网络接口层: MAC VLAN

  20. 网络层:IP ARP ICMP
  21. 传输层:TCP UDP
  22. 应用层:HTTP DNS SMTP

    搜索baidu,会用到计算机网络中的什么层?每层是干什么的

    浏览器中输入URL,浏览器要将URL解析为IP地址,解析域名就要用到DNS协议,首先主机会查询DNS的缓存,如果没有就给本地DNS发送查询请求。DNS查询分为两种方式,一种是递归查询,一种是迭代查询。如果是迭代查询,本地的DNS服务器,向根域名服务器发送查询请求,根域名服务器告知该域名的一级域名服务器,然后本地服务器给该级域名服务器发送查询请求, 然后依次类推直到查询到该域名的IP地址。
    DNS服务器是基于UDP的,因此会用到UDP协议。
    得到IP地址后,浏览器就要与服务器建立一一个http连接。因此要用到http协议,http协议报文格式上面已经提到。http 生成一个get请求报文,将该报文传给TCP层处理,所以还会用到TCP协议。如果采用https还会使用https协议先对http数据进行加密。TCP层如果有需要先将HTTP数据包分片,分片依据路径MTU和MSS。TCP的数据包然后会发送给IP层,用到IP
    协议。IP层通过路由选路,—跳一跳发送到目的地址。
    当然在一个网段内的寻址是通过以太网协议实现(也可以是其他物理层协议,比如PPP,SLIP), 以太网协议需要直到目的IP地址的物理地址,有需要ARP协议。
    其中:

  23. DNS协议,http协议,https协议属于应用层

应用层是体系结构中的最高层。应用层确定进程之间通信的性质以满足用户的需要。这里的进程就是指正在运行的程序。应用层不仅要提供应用进程所需要的信息交换和远地操作,而且还要作为互相作用的应用进程的用户代理,来完成一- 些为进行语义上有意义的信息交换所必须的功能。应用层直接为用户的应用进程提供服务。

  1. TCP/UDP 属于传输层

传输层的任务就是负责主机中两个进程之间的通信。因特网的传输层可使用两种不同协议:即面向连接的传输控制协议TCP,和无连接的用户数据报协议UDP。面向连接的服务能够提供可靠的交付,但无连接服务则不保证提供可靠的交付,它只是“尽最大努力交付”。这两种服务方式都很有用,备有其优缺点。在分组交换网内的各个交换结点机都没有传输层。

  1. IP协议,ARP协议属于网络层

网络层负责为分组交换网上的不同主机提供通信。在发送数据时,网络层将运输层产生的报文段或用户数据报封装成分组或包进行传送。在TCP/IP体系中,分组也叫作IP 数据报,或简称为数据报。网络层的另一个任务就是要选择合适的路由,使源主机运输层所传下来的分组能够交付到目的主机。

  1. 数据链路层

当发送数据时,数据链路层的任务是将在网络层交下来的IP数据报组装成帧,在两个相邻结点间的链路上传送以帧为单位的数据。每一帧包括数据和必要的控制信息(如同步信息、地址信息、差错控制、以及流量控制信息等)。控制信息使接收端能够知道一个帧从哪个比特开始和到哪个比特结束。控制信息还使接收端能够检测到所收到的帧中有无差错。

  1. 物理层

物理层的任务就是透明地传送比特流。在物理层上所传数据的单位是比特。传递信息所利用的一些物理媒体,如双绞线、同轴电缆、光缆等,并不在物理层之内而是在物理层的下面。因此也有人把物理媒体当做第0层。

TCP拥塞控制?以及达到什么情况的时候开始减慢增长的速度?

拥塞控制是防止过多的数据注入网络,使得网络中的路由器或者链路过载。流量控制是点对点的通信量控制,而拥塞控制是全局的网络流量整体性的控制。发送双方都有一个拥塞窗口—cwnd.

慢开始

最开始发送方的拥塞窗口为1,由小到大逐渐增大发送窗口和拥塞窗口。每经过一个传输轮次,拥塞窗口cwnd加倍。当cwnd超过慢开始门限,则使用拥塞避免算法,避免cwnd增长过大。

拥塞避免

每经过个往返时间RTT,cwnd就增长1。在慢开始和拥塞避免的过程中,一旦发现网络拥塞,就把慢开始门限设为当前值的一半,并且重新设置cwnd为1,重新慢启动。( 乘法减小,加法增大)

快重传

接收方每次收到一个失序的报文段后就立即发出重复确认,发送方只要连续收到三个重复确认就立即重传(尽早重传未被确认的报文段)。

快恢复

当发送方连续收到了三个重复确认,就乘法减半(慢开始门限减半),将当前的cwnd设置为慢开始门限,并且采用拥塞避免算法(连续收到了三个重复请求,说明当前网络可能没有拥塞。
采用快恢复算法时,慢开始只在建立连接和网络超时才使用。

达到什么情况的时候开始减慢增长的速度?

采用慢开始和拥塞避免算法的时候

  1. 一旦cwnd>慢开始门限,就采用拥塞避免算法,减慢增长速度
  2. 一旦出现丢包的情况,就重新进行慢开始,减慢增长速度

    采用快恢复和快重传算法的时候

  3. 一旦cwnd>慢开始门限,就采用拥塞避免算法,减慢增长速度

  4. 一-旦发送方连续收到了三个重复确认,就采用拥塞避免算法,减慢增长速度。

    TCP/IP数据链路层的交互过程

    网络层等到数据链层用mac地址作为通信目标,数据包到达网络等准备往数据链层发送的时候,首先会去自己的arp缓存表(存着ip mac对应关系)去查找改目标ip的mac地址,如果查到了,就讲目标ip的mac地址封装到链路层数据包的包头。如果缓存中没有找到,会发起一一个广播: who is ip XXX tell ip XXX, 所有收到的广播的机器看这个ip 是不是自己的,如果是自己的,则以单拨的形式将自己的mac地址回复给请求的机器。

    网络编程的基本步骤

    服务端: socket-bind-listen-accept
    客户端: socket-connect20、TCP和UDP的区别和各目适用的场景

    TCP和UDP的区别和各自适用的场景

    连接

    TCP是面向连接的传输层协议,即传输数据之前必须先建立好连接。
    UDP无连接。

    服务对象

    TCP是点对点的两点间服务,即一条TCP连接只能有两个端点;
    UDP支持一一对一,一-对多,多对一,多对多的交互通信。

    可靠性

    TCP是可靠交付:无差错,不丢失,不重复,按序到达。
    UDP是尽最大努力交付,不保证可靠交付。

    拥塞控制,流量控制

    TCP有拥塞控制和流量控制保证数据传输的安全性。
    UDP没有拥塞控制,网络拥塞不会影响源主机的发送效率。

    报文长度

    TCP是动态报文长度,即TCP报文长度是根据接收方的窗口大小和当前网络拥塞情况决定的。
    UDP面向报文,不合并,不拆分,保留上面传下来报文的边界。
    首部开销
    TCP首部开销大,首部20个字节。
    UDP首部开销小,8字节。(源端口, 目的端口,数据长度,校验和)

    TCP和UDP适用场景

    从特点上我们已经知道,TCP是可靠的但传输速度慢,UDP是不可靠的但传输速度快。因此在选用具体协议通信时,应该根据通信数据的要求而决定。
    若通信数据完整性需让位与通信实时性,则应该选用TCP协议(如文件传输、重要状态的更新等) ;反之,则使用UDP协议(如视频传输、实时通信等)。

    http协议

    HTTP 协议

    HTTP协议是Hyper Text Transfer Protocol (超文本传输协议)的缩写,是用于从万维网(WWW:WorldWideWeb)服务器传输超文本到本地浏览器的传送协议。
    HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件,图片文件,查询结果等)。
    HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990 年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1. 1的规范化工作正在进行之中,而且HTTP-NG (Next Generation of HTTP)的建议已经提出。
    HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。

    HTTP 协议特点

    简单快速

    客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

    灵活

    HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

    无连接

    无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

    无状态

    HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

  5. 支持B/S及C/S模式。

  6. 默认端口80
  7. 基于TCP协议

    HTTP 过程概述

    HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文, 请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

    HTTP请求/响应的步骤如下

  8. 客户端连接到Web服务器

一个 HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www. baidu. com

  1. 发送HTTP请求

通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。

  1. 服务器接受请求并返回HTTP响应

Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。

  1. 释放连接TCP连接

若connection模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection模式为keepalive,则该连接会保持一段时 间,在该时间内可以继续接收请求;

  1. 客户端浏览器解析HTML内容

客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每—个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

举例

在浏览器地址栏键入URL,按下回车之后会经历以下流程:

  1. 浏览器向DNS服务器请求解析该URL中的域名所对应的IP地址;
  2. 解析出IP地址后,根据该IP地址和默认端口80, 和服务器建立TCP连接;
  3. 浏览器发出读取文件(URL中域名后面部分对应的文件)的HTTP请求,该请求报文作为TCP三次握手的第三个报文的数据发送给服务器;
  4. 服务器对浏览器请求作出响应,并把对应的html 文本发送给浏览器;
  5. 释放TCP连接;
  6. 浏览器将该html 文本并显示内容;

    GET和POST的区别

    概括

    对于GET方式的请求,浏览器会把httpheader和data一并发送出去,服务器响应200(返回数据) ;而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200ok(返回数据)

    区别

  7. get参数通过url传递,post放在request body中。

  8. get请求在url中传递的参数是有长度限制的,而post没有。
  9. get 比post更不安全,因为参数直接暴露在url中,所以不能用来传递敏感信息。
  10. get请求只能进行url编码,而post支持多种编码方式。
  11. get请求会浏览器主动cache, 而post支持多种编码方式。
  12. get请求参数会被完整保留在浏览历史记录里,而post中的参数不会被保留。
  13. ET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。
  14. GET产生一个TCP数据包; POST产生两个TCP数据包。

    socket编程中服务器端和客户端主要用到哪些函数

    基于TCP的socket

    服务器端程序

  15. 创建一个socket, 用函数socket()

  16. 绑定IP地址、端口等信息到socket上,用函数bind()
  17. 设置允许的最大连接数,用函数listen()
  18. 接收客户端上来的连接,用函数accept()
  19. 收发数据,用函数send()和recv(),或者read()和write()
  20. 关闭网络连接

    客户端程序

  21. 创建-一个socket,用函数socket()

  22. 设置要连接的对方的IP地址和端口等属性
  23. 连接服务器,用函数connect()
  24. 收发数据,用函数send()和recv(),或read()和write()
  25. 关闭网络连接

image.png

基于UDP的socket

服务器端流程

  1. 建立套接字文件描述符,使用函数socket(), 生成套接字文件描述符。
  2. 设置服务器地址和侦听端口,初始化要绑定的网络地址结构。
  3. 绑定侦听端口,使用bind()函数,将套接字文件描述符和一个地址类型变量进行绑定。
  4. 接收客户端的数据,使用recvfrom()函数接收客户端的网络数据。
  5. 向客户端发送数据,使用sendto()函数向服务器主机发送数据。
  6. 关闭套接字,使用close()函数释放资源。UDP协议的客户端流程

    客户端流程

  7. 建立套接字文件描述符,socket()。

  8. 设置服务器地址和端口,struct sockaddr.
  9. 向服务器发送数据,sendto()。
  10. 接收服务器的数据,recvfrom() 。
  11. 关闭套接字,close()。

image.png

UDP的connect函数

除非套接字已连接,否则异步错误是不会反悔到UDP套接字的。我们确实可以给UDP套接字调用connect,然而这样做的结果却与TCP连接不同的是没有三路握手过程。内核只是检查是否存在立即可知的错误,记录对端的IP地址和端口号,然后立即返回调用进程。对于已连接UDP套接字,与默认的未连接UDP套接字相比,发生了三个变化。其实一旦UDP套接字调用了connect 系统调用,那么这个UDP.上的连接就变成一一对一的连接,但是通过这个UDP连接传输数据的性质还是不变的,仍然是不可靠的UDP连接。一旦变成一对一的连接,在调用系统调用发送和接受数据时也就可以使用TCP那一套系统调用了。

  1. 我们再也不能给输出操作指定目的IP地址和端口号。也就是说,我们不使用sendto,而改用write或send。写到已连接UDP套接字上的任何内容都自动发送到由connect指定的协议地址。可以给已连接的UDP套接字调用sendto,但是不能指定目的地址。sendto 的第五个参数必须为空指针,第六个参数应该为0.
  2. 不必使用recvfrom以获悉数据报的发送者,而改用read、recv 或recvmsg。在一个已连接UDP套接字上,由内核为输入操作返回的数据报只有那些来自connect指定协议地址的数据报。这样就限制一个已连接UDP套接字能且仅能与一一个对端交换数据报。
  3. 由已连接UDP套接字引发的异步错误会返回给它们所在的进程,而未连接的UDP套接字不接收任何异步错误。来自任何其他IP地址或断开的数据报不投递给这个已连接套接字,因为它们要么源IP地址要么源UDP端口不与该套接字connect到的协议地址相匹配。UDP客户进程或服务器进程只在使用自己的UDP套接字与确定的唯一对端进行通信时, 才可以调用connect。调用connect的通常是UDP客户,不过有些网络应用中的UDP服务器会与单个客户长时间通信TFTP,这种情况下,客户和服务器都可能调用connect。

来自任何其他IP地址或断开的数据报不投递给这个已连接套接字,因为它们要么源IP地址要么源UDP端口不与该套接字connect到的协议地址相匹配。
UDP客户进程或服务器进程只在使用自己的UDP套接字与确定的唯一对端进行通信时, 才可
以调用connect。调用connect的通常是UDP客户,不过有些网络应用中的UDP服务器会与单个客户长时间通信TFTP,这种情况下,客户和服务器都可能调用connect。

阻塞,非阻塞,同步,异步

阻塞和非阻塞

调用者在事件没有发生的时候,一直在等待事件发生,不能去处理别的任务这是阻塞。调用者在事件没有发生的时候,可以去处理别的任务这是非阻塞。

同步和异步

调用者必须循环自去查看事件有没有发生,这种情况是同步。调用者不用自己去查
看事件有没有发生,而是等待着注册在事件上的回调函数通知自己,这种情况是异步。

Socket编程的send() recv() accept()

send()

send函数用来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答,send的作用是将要发送的数据拷贝到缓冲区,协议负责传输。

recv()

recv函数用来从TCP连接的另一端接收数据,当应用程序调用recv函数时,recv 先等待s的发送缓冲中的数据被协议传送完毕,然后从缓冲区中读取接收到的内容给应用层。

accept()

accept函数用了接收一个连接,内核维护了半连接队列和一个已完成连接队列,当队列为空的时候,accept 函数阻塞,不为空的时候accept函数从上边取下来一个已完成连接, 返回一个文件描述符。