网络编程--TCP和UDP

网络编程相关文章

网络编程–TCP和UDP
网络编程–HTTP和HTTPS
网络编程-Socket

一、OSI七层协议

先上图,TCP和UDP在传输层
网络编程--TCP和UDP_第1张图片

二、TCP

先上TCP头部结构图,看不懂无所谓,下面慢慢了解

网络编程--TCP和UDP_第2张图片
我们只需要了解三个参数、序列号和确认号就可以了,TCP三次握手的场景会用到(重点理解)

  1. ACK -----确认接收到的数据

TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1

  1. **SYN(SYNchronization) ** ----创建一个连接

在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1,因此, SYN置1就表示这是一个连接请求或连接接受报文。

  1. FIN (finis) 终结一个连接(4次握手的时候用到)

终结的意思, 用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。

  1. 序列号和确认号

TCP会话的每一端都包含一个32位(bit)的序列号,该序列号被用来跟踪该端发送的数据量。每一个包中都包含序列号,在接收端则通过确认号用来通知发送端数据成功接收

1、 三次握手

  • 定义
    三次握手的目的是建立可靠的通信信道,主要的目的就是双方确认自己与对方的发送与接收机能正常

1.1、 握手流程

还是先上流程图,先上车再解释

网络编程--TCP和UDP_第3张图片

客户端(Client) 服务器(Server)

  1. 第一次握手 ----Client发出请求连接

Client将SYN置1,ACK=0,随机产生一个初始序列号seq=x发送给Server,进入SYN_SENT状态(SYN=1,ACK=0,seq=x)

  1. 第二次握手 ------Server 进行回复确认

Server收到Client的SYN=1之后,知道客户端请求建立连接,将自己的SYN置1,ACK
置1,产生一个acknowledge number=sequence number+1( 就是确认号ack=x+1),并随机产生一个自己的初始序列号seq=x,发送给客户端;进入SYN_RCVD状态(SYN=1,ACK=1,seq=y,ack=x+1)

  1. 第三次握手 -----Client 再进行一次确认

客户端检查acknowledge number是否为序列号+1(ack=x+1),ACK是否为1,检查正确之后将自己的ACK置为1,产生一个acknowledge number=服务器发的序列号+1(ack=y+1),发送给服务器;进入ESTABLISHED状态;服务器检查ACK为1和acknowledge number为序列号+1ack=y+1)之后,也进入ESTABLISHED状态;完成三次握手,连接建立

  • 简单理解三次握手流程
  1. 客户端向服务端发送SYN
  2. 服务端返回SYN,ACK
  3. 客户端发送ACK
  • 用现实理解三次握手的具体细节
  1. 你打电话给你朋友
  2. 你朋友接了,朋友:你好,我是惠惠,请问你是?
  3. 你:我是丢丢,最近还好吗?

1.2、建立连接为什么要三次握手,不可以两次握手

  • 原因
    可能会出现已失效的连接请求报文段又传到了服务器端

  • 重点理解

  • 假设不采用 “三次握手”,那么只要 server 发出确认,新的连接就建立了

    1. client 发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server
    2. 本来这是一个早已失效的报文段。但 server 收到此失效的连接请求报文段后,就误认为是 client 再次发出的一个新的连接请求
    3. 于是就向 client 发出确认报文段,同意建立连接
    4. 由于现在 client 并没有发出建立连接的请求,因此不会理睬 server 的确认,也不会向 server 发送数据。但 server 却以为新的运输连接已经建立,并一直等待 client 发来数据。这样,server 的很多资源就白白浪费掉了
  • 采用 “三次握手” 的办法可以防止上述现象发生。例如刚才那种情况,client 不会向 server 的确认发出确认。server 由于收不到确认,就知道 client 并没有要求建立连接。两次握手无法保证Client正确接收第二次握手的报文(Server无法确认Client是否收到),也无法保证Client和Server之间成功互换初始序列号

1.3、 第三次握手中,如果客户端的ACK未送达服务器的情况

  • Server端
    由于Server没有收到ACK确认,因此会每隔 3秒 重发之前的SYN+ACK(默认重发五次,之后自动关闭连接进入CLOSED状态),Client收到后会重新传ACK给Server

  • Client端

    1. 在Server进行超时重发的过程中,如果Client向服务器发送数据,数据头部的ACK是为1的,所以服务器收到数据之后会读取 ACK number,进入 establish 状态
    2. 在Server进入CLOSED状态之后,如果Client向服务器发送数据,服务器会以RST包应答

1.4、 已经建立了连接,但客户端出现了故障的情况

服务器每收到一次客户端的请求后都会重新复位一个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

1.5 初始序列号

TCP连接的一方A,随机选择一个32位的序列号(Sequence Number)作为发送数据的初始序列号(Initial Sequence Number,ISN),,比如为1000,以该序列号为原点,对要传送的数据进行编号:1001、1002…三次握手时,把这个初始序列号传送给另一方B,以便在传输数据时,B可以确认什么样的数据编号是合法的;同时在进行数据传输时,A还可以确认B收到的每一个字节,如果A收到了B的确认编号(acknowledge number)是2001,就说明编号为1001-2000的数据已经被B成功接受。

2、 四次挥手

  • 定义
    在网络数据传输中,传输层协议断开连接的过程我们称为四次挥手

    2.1、 握手流程

废话不说,还是先上流程图
网络编程--TCP和UDP_第4张图片

  1. 第一次挥手
    Client将FIN置为1,发送一个序列号seq=x给Server;进入FIN_WAIT_1状态

  2. 第二次挥手
    Server收到FIN之后,发送一个ACK=1,acknowledge number=收到的序列号seq+1(ack=x+1);进入CLOSE_WAIT状态。此时客户端已经没有要发送的数据了,但仍可以接受服务器发来的数据

  3. 第三次挥手
    Server将FIN置1,发送一个序列号seq=y给Client;进入LAST_ACK状态

  4. Client收到服务器的FIN后,进入TIME_WAIT状态;接着将ACK置1,发送一个acknowledge number=序列号+1给服务器(ack=y+1);服务器收到后,确认acknowledge number后,变为CLOSED状态,不再向客户端发送数据。客户端等待2*MSL(报文段最长寿命)时间后,也进入CLOSED状态。完成四次挥手

  • 用现实理解四次挥手的具体细节
    四次挥手断开连接是因为要确定数据全部传书完了
  1. 你跟你女朋友通话中,你:宝贝,我要睡觉了,挂了哦!!!
  2. 你女朋友:好呀,我也要睡觉了,你可以挂了
  3. 电话粥煲的差不多了,女朋友也没话题了,你女朋友:那我挂了哦!
  4. 你:好!,女朋友挂了电话,你才敢挂手机睡觉

2.2、 为什么不能把服务器发送的ACK和FIN合并起来,变成三次挥手(CLOSE_WAIT状态意义是什么)?

因为服务器收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复ACK,表示接收到了断开连接的请求。等到数据发完之后再发FIN,断开服务器到客户端的数据传送

2.3、 如果第二次挥手时服务器的ACK没有送达客户端的情况

客户端没有收到ACK确认,会重新发送FIN请求。

2.4、 客户端TIME_WAIT状态的意义

第四次挥手时,客户端发送给服务器的ACK有可能丢失,TIME_WAIT状态就是用来重发可能丢失的ACK报文。如果Server没有收到ACK,就会重发FIN,如果Client在2*MSL的时间内收到了FIN,就会重新发送ACK并再次等待2MSL,防止Server没有收到ACK而不断重发FIN。 MSL(MaximumSegment Lifetime),指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

三、TCP 与 UDP 区别

对比 TCP UDP
可靠性 可靠 不可靠
连接性 面向链接 无连接
报文 面向字节流 面向报文
传说效率 效率低 效率高
传输速度
双工性 一对一 一对一,一对多,多对一,多对多
流量控制
应用场合 对效率要求相对较低,对准确性的要求相对较高,或者要求有连接的场景 对效率要求相对较高,对准确性的要求相对较低的场景
协议 FTP,Telnet,SMTP,POP3,HTTP ,HTTPS DNS,SNMP,TFTP
  1. 连接
  • TCP是面向连接的协议,发送数据前要先建立连接,TCP提供可靠的服务,也就是说,通过TCP连接传输的数据不会丢失,没有重复,并且按顺序到达
  • UDP是无连接的协议,发送数据前不需要建立连接,是没有可靠性
  1. TCP通信类似于于要打个电话,接通了,确认身份后,才开始进行通行。UDP通信类似于学校广播,靠着广播播报直接进行通信
  2. TCP只支持点对点通信,UDP支持一对一、一对多、多对一、多对多
  3. TCP是面向字节流的,UDP是面向报文的; 面向字节流是指发送数据时以字节为单位,一个数据包可以拆分成若干组进行发送,而UDP一个报文只能一次发完
  4. TCP首部开销(20字节)比UDP首部开销(8字节)要大
  5. UDP 的主机不需要维持复杂的连接状态表

1、TCP 或UDP的应用层协议分析

1.1、运行在TCP协议上的协议

  1. HTTP(Hypertext Transfer Protocol,超文本传输协议),主要用于普通浏览
  2. HTTPS(HTTP over SSL,安全超文本传输协议),HTTP协议的安全版本
  3. FTP(File Transfer Protocol,文件传输协议),用于文件传输
  4. POP3(Post Office Protocol, version 3,邮局协议),收邮件用
  5. SMTP(Simple Mail Transfer Protocol,简单邮件传输协议),用来发送电子邮件
  6. TELNET(Teletype over the Network,网络电传),通过一个终端(terminal)登陆到网络
  7. SSH(Secure Shell,用于替代安全性差的TELNET),用于加密安全登陆用

1.2、 运行在UDP协议上的协议

  1. BOOTP(Boot Protocol,启动协议),应用于无盘设备
  2. NTP(Network Time Protocol,网络时间协议),用于网络同步
  3. DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),动态配置IP地址

1.3、运行在TCP和UDP协议上

  1. DNS(Domain Name Service,域名服务),用于完成地址查找,邮件转发等工作
  2. ECHO(Echo Protocol,回绕协议),用于查错及测量应答时间(运行在TCP和UDP协议上)
  3. SNMP(Simple Network Management Protocol,简单网络管理协议),用于网络信息的收集和网络管理
  4. DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),动态配置IP地址
  5. ARP(Address Resolution Protocol,地址解析协议),用于动态解析以太网硬件的地址

网络编程相关文章

网络编程–TCP和UDP
网络编程–HTTP和HTTPS
网络编程-Socket

你可能感兴趣的:(tcp/ip,网络,udp,http,https)