计算机网络的几个概念

TCP是一个面向连接的,安全的,流式传输协议,这个协议是一个传输层协议。

面向连接:是一个双向连接,通过三次握手完成,断开连接需要通过四次挥手完成。
安全:tcp通信过程中,会对发送的每一数据包都会进行校验, 如果发现数据丢失, 会自动重传
流式传输:发送端和接收端处理数据的速度,数据的量都可以不一致

TCP UDP 区别

  1. 连接方式:
    TCP是面向连接的协议,在数据传输前,TCP会通过三次握手建立连接,确保双方都准备好进行通信。
    UDP无连接
  2. 传输可靠性:
    通过三次握手和四次挥手,重传机制,保证数据包无差错、不丢失、不重复且按顺序送达
    UDP只管传输,别的由上层解决
  3. 数据结构:
    TCP基于字节流,数据之间没有明确划分
    UDP基于数据报,每个UDP数据报都是一个独立的信息单元,包含完整的源地址、目的地址以及数据
  4. 流量控制和拥塞控制
    TCP:具有流量控制和拥塞控制机制,以避免网络拥塞和数据丢失。
  5. 连接对象个数
    UDP:支持一对一、一对多、多对一、多对多的通信。
    TCP:一对一通信,即一个TCP连接只能在两个端点之间进行。

什么时候使用TCP,什么时候使用UDP

用TCP:文件传输、邮件服务、HTTP 应用,比如发送微信消息,微信语音,就算网络不好,也能安全送到、

用UDP:视频流传输、音频传输、游戏通信,比如微信通话,微信视频通话

TCP的流量控制和拥塞控制机制

  1. 流量控制(Flow Control):流量控制是指在发送方和接收方之间控制数据传输速率,以便使接收方能够根据自己的处理能力来接收数据。如果接收方的缓冲区已满,它会发送一个或多个零窗口通知(Zero Window Notification)给发送方,告诉发送方暂停发送数据。当接收方处理完数据并有足够的缓冲空间时,它会发送一个窗口更新(Window Update)通知,告诉发送方可以继续发送数据。

滑动窗口
窗口大小:TCP连接中的接收方会维护一个窗口,表示它可以接收的数据量。这个窗口的大小根据接收方的缓冲区情况动态变化。
滑动窗口:随着数据的发送和确认,窗口的位置会不断移动,称之为“滑动”。这意味着一旦数据被接收并确认,窗口就会向前移动,允许更多的新数据发送。
发送方与接收方的交互
发送方:发送方在每次发送数据时,会根据接收方当前可用的窗口大小来决定可以发送多少数据。如果接收方的窗口大小为N字节,发送方最多只会发送N字节的数据。

  1. 拥塞控制(Congestion Control):拥塞控制是指在网络中控制数据传输速率,以避免网络拥塞。TCP 使用多种拥塞控制算法,例如:

慢启动(Slow Start):在刚开始发送数据时,TCP 会采用一个很小的初始值作为拥塞窗口(Congestion Window, cwnd),每收到一个 ACK(确认应答),拥塞窗口大小就加 1。当出现拥塞(例如,超时或三个重复 ACK)时,拥塞窗口会被重置为初始值。
拥塞避免(Congestion Avoidance):当拥塞窗口达到慢启动阈值(Slow Start Threshold, ssthresh)时,TCP 会进入拥塞避免阶段,每收到一个 ACK,拥塞窗口大小加 1/cwnd。
快重传(Fast Retransmit):当接收到三个重复 ACK 时,TCP 会假设网络出现了拥塞,并立即重传丢失的数据包,而不必等待超时。
快恢复(Fast Recovery):当进行快重传时,TCP 会将慢启动阈值设置为拥塞窗口的一半,并进入拥塞避免阶段,而不是返回慢启动阶段。

TCP的重传问题

发送方每发送一个数据段就启动一个定时器
如果发送方在定时器到期之前没有收到确认,它会认为数据段可能已经丢失,并触发重传机制。发送方将重传该数据段,并重新启动定时器。

调整定时器:TCP使用一种称为“自适应重传”的技术来调整重传定时器。通过测量往返时间(RTT)并使用这些测量值来估计一个合适的超时时间,TCP可以更准确地判断何时重传数据段。

最大重传次数:为了防止无限循环,TCP有一个最大重传次数(通常是6次),即使超时时间不断增长,超过这个次数后,TCP会认为数据段可能永远丢失,并停止重传

TCP粘包问题

多个数据包粘连到一起无法拆分,是我们的需求过于复杂造成的,不是TCP的问题
解决办法:
使用标准的应用层协议(比如:http、https)来封装要传输的不定长的数据包
在发送数据块之前, 在数据块最前边添加一个固定大小的数据头, 这时候数据由两部分组成:数据头+数据块
在这里插入图片描述

soket通信流程

套接字是一套网络通信的接口,使用这套接口就可以完成网络通信。

字节序

因为在不同的计算机体系中,字节、字等的存储机制有所不同,在通信传输中,双方要达成一致使用什么顺序传输。
主机字节序(小端)
数据的低位字节存储到内存的低地址位, 数据的高位字节存储到内存的高地址位
我们使用的PC机,数据的存储默认使用的是小端
网络字节序(大端)
据的低位字节存储到内存的高地址位, 数据的高位字节存储到内存的低地址位
套接字通信过程中操作的数据都是大端存储的
IP地址转换
主机字节序的IP地址是字符串, 网络字节序IP地址是整形
将大端的整形数, 转换为小端的点分十进制的IP地址

通信中send和receive的为什么会阻塞

使用tcp协议进行通讯的双方,都各自有一个发送缓冲区和一个接收缓冲区。而缓冲区是有大小的,因此发生阻塞的本质原因是缓冲区满了,别的字节流消息无法进入缓冲区。

接收端接收数据的速度小于发送端发送数据的速度,导致接收端的读缓冲区填满,接收端发送报文给发送端告诉他我已经满了,先别发。这样发送端的写缓冲区被占满了,导致阻塞

receive阻塞是因为读缓冲区中没数据。

服务器端

		1.创建sokcet。socket()        

        2.设置地址。struct sockaddr_in service_addr;   //设置服务器通信端口

        3.绑定。bind();

        4.监听。listen();

        5.链接。accept();

        6.收发消息。read()/send()

        7.关闭sokcet。close

客户端

		1.创建socket。socket()        

        2.设置地址。struct sockaddr_in service_addr;

        3.链接。connect()

        4.收发消息。read()/send()

        5.关闭链接。close()

三次握手和四次挥手

在服务器进入监听阻塞状态后,由客户端发送连接请求,开始建立连接,三次握手,对于程序猿来说只需要在客户端调用connect()函数,三次握手就自动进行了
结束连接,四次挥手
在这里插入图片描述

三次握手过程说明:
1、由客户端发送建立TCP连接的请求报文,其中报文中包含seq序列号,是由发送端随机生成的,并且将报文中的SYN字段置为1,表示需要建立TCP连接。(SYN=1,seq=x,x为随机生成数值)SYN是一个标志位(Flag),用于在建立TCP连接时进行同步步骤。

2、由服务端回复客户端发送的TCP连接请求报文,其中包含seq序列号,是由服务端随机生成的,并且将SYN置为1,而且会产生ACK字段,ACK字段数值是在客户端发送过来的序列号seq的基础上加1进行回复,以便客户端收到信息时,知晓自己的TCP建立请求已得到验证。(SYN=1,ACK=x+1,seq=y,y为随机生成数值)这里的ack加1可以理解为是确认和谁建立连接。

3、客户端收到服务端发送的TCP建立验证请求后,会使自己的序列号加1表示,并且再次回复ACK验证请求,在服务端发过来的seq上加1进行回复。(SYN=1,ACK=y+1,seq=x+1)

简要说明:

  1. 有客户端发起TCP连接请求,发送一个随机序列号,和一个标志位
  2. 服务器回复客户端,发送一个确认字段,确认字段是客户端发的随机序列+1,还发送一个随机序列和和标志位
  3. 客户端收到验证请求回复服务器,发送服务器发的序列+1和自己的序列+1

为什么三次握手

当客户端发出第一个连接请求报文段时并没有丢失,而是在某个网络节点出现了长时间的滞留,以至于延误了连接请求在某个时间之后才到达服务器。这应该是一个早已失效的报文段。但是服务器在收到此失效的连接请求报文段后,以为是客户端的一个新请求,于是向客户端发出了确认报文段,同意建立连接。

这时新的连接已经建立了,但是由于客户端没有发出建立连接的请求,因此不会管服务器的确认,也不会向服务器发送数据,但服务器却以为新的运输连接已经建立,一直在等待,所以,服务器的资源就白白浪费掉了。

在这里插入图片描述

四次挥手过程说明:
1、客户端发送断开TCP连接请求的报文,其中报文中包含seq序列号,是由发送端随机生成的,并且还将报文中的FIN字段置为1,表示需要断开TCP连接。(FIN=1,seq=x,x由客户端随机生成)

2、服务端会回复客户端发送的TCP断开请求报文,其包含seq序列号,是由回复端随机生成的,而且会产生ACK字段,ACK字段数值是在客户端发过来的seq序列号基础上加1进行回复,以便客户端收到信息时,知晓自己的TCP断开请求已经得到验证。(FIN=1,ACK=x+1,seq=y,y由服务端随机生成)

3、服务端在回复完客户端的TCP断开请求后,不会马上进行TCP连接的断开,服务端会先确保断开前,所有传输到A的数据是否已经传输完毕,一旦确认传输数据完毕,就会将回复报文的FIN字段置1,并且产生随机seq序列号。(FIN=1,ACK=x+1,seq=z,z由服务端随机生成)

4、客户端收到服务端的TCP断开请求后,会回复服务端的断开请求,包含随机生成的seq字段和ACK字段,ACK字段会在服务端的TCP断开请求的seq基础上加1,从而完成服务端请求的验证回复。(FIN=1,ACK=z+1,seq=h,h为客户端随机生成)
至此TCP断开的4次挥手过程完毕

为什么要四次挥手

TCP是基于全双工通信的,所以双方都可以主动释放连接。
四次挥手的意义就在于,当客户端发送完最后一条数据之后,但可能B服务器还有未发送给客户端的数据。
所以客户端在发送完收据后可以请求释放连接,此时服务器给客户端响应,告诉客户端知道你想断开连接,此时客户端还可以继续接收服务器发送的信息。
在服务器处理完工作后,也请求释放连接。客户端同意后,就断开连接。
这样可以保证数据正常可靠的交互。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值