网络通信-TCP协议网络通信的过程

网络通信过程:

  • 1、两台电脑之间可以通过网线连接直接通信,但是需要提前设置好ip地址以及网络掩码。并且IP地址需要控制在同一个网段内,如:192.168.1.1和182.168.1.xx就是同一个网段的。网络掩码(A类:255.0.0.0;B类:255.255.0.0;C类:255.255.255.0)的作用是与ip按位与得到网络号,判断是不是在同一个网段内。
    网络通信-TCP协议网络通信的过程_第1张图片
  • 2、使用集线器组成网络,实现多台电脑之间的通信。(已经不常用了)
    网络通信-TCP协议网络通信的过程_第2张图片
    集线器的接口比较少,使用集线器组网时有一个缺点,它是以广播的方式进行数据传输的,如果集线器收到来自电脑A的数据,发送给B(假设集线器还连有电脑C和D),集线器会把A的数据发给每台电脑(B、C、D),因此会造成网络拥堵。
  • 3、使用交换机组成网络,实现多台电脑之间的通信。交换机克服了集线器的缺点,当需要广播的时候发送广播,当需要单播的时候单播,他已经替代了之前的集线器,企业中就是使用交换机完成多台电脑的组网。它的作用有:
    • 1、转发过滤,当一个数据帧的目的地址在MAC地址表中有映射,它会被转发到连接目的节点的端口而不会是所有端口(如果是广播帧则会转发至所有端口)
    • 2、学习功能,以太网交换机了解每一个端口连接设备的MAC地址,并将地址同相应的端口映射起来放到交换机的缓存MAC地址表中。
      网络通信-TCP协议网络通信的过程_第3张图片
  • 4、通过路由器组网,交换机只能连接同一网段的设备,不同网段的设备不能通信。比如:网络A的ip地址范围:192.168.1.1-192.168.1.254,子网掩码为255.255.255.0,网络B的IP地址范围为:192.168.2.1-192.168.2.254,子网掩码为255.255.255.0,在没有路由器的情况下,两个网络之间是不能进行TCP/IP通信的,即使连接在同一个交换机或集线器上,TCP/IP会根据子网掩码判定两个网络的主机不在同一网段上,要实现这两个网络的通信则必须通过网关(网关实质上是网络通向其他网络的ip地址),网络A发现数据包的目的ip不在本地网络就把数据包转发给自己的网关,再由网关转发给网络B的网关,网关B再转发给某个主机。
    网络通信-TCP协议网络通信的过程_第4张图片

小结:

  • MAC地址:在设备与设备之间数据通信时用来标记收发双方(网卡的序列号)
  • IP地址:在逻辑上标记一台电脑,用来指引数据包的收发方向(相当于电脑的序列号)
  • 网络掩码:用来区分ip地址的网络号和主机号
  • 默认网关:当需要发送的数据包的目的ip不在本网段内时,就会发送给默认的一台电脑,成为网关(网关实质上就是网络通向其他网络的ip地址,比如上图中的192.168.2.1)
  • 集线器:已过时,用来连接多态电脑,缺点:每次收发数据都进行广播,网络会变的拥堵
  • 交换机:集线器的升级版,有学习功能知道需要发送给哪台设备,根据需要进行单播、广播
  • 路由器:连接多个不同的网段,让他们之间可以进行收发数据,每次收到数据后,ip不变,但是MAC地址会变化
  • DNS:用来解析出IP(类似电话簿)
  • http服务器:提供浏览器能够访问到的数据

在通讯过程中,ip地址是不发生任何变化的,如192.168.1.1 --> 192.168.2.3,Mac地址在两个设别之间通信时,在变化:如上图,路由器的Mac地址–> PC机的Mac地址

TCP/IP协议族中各协议之间的关系如下图:
网络通信-TCP协议网络通信的过程_第5张图片

各协议的作用:

  • 1、ARP协议:根据ip找Mac地址
  • 2、RARP协议:根据Mac地址找ip
  • 3、ICMP协议:ping的时候
  • 4、DHCP协议:它能够发现局域网中没有分配ip的电脑,然后给他分配一个ip

地址解析协议 ,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。
ARP通信的例子:
假设:主机A的IP地址为192.168.1.1,MAC地址为0A-11-22-33-44-01;主机B的IP地址为192.168.1.2,MAC地址为0A-11-22-33-44-02;当主机A要与主机B通信时,地址解析协议可以将主机B的IP地址(192.168.1.2)解析成主机B的MAC地址,以下为工作流程:

  • 第1步:根据主机A上的路由表内容,IP确定用于访问主机B的转发IP地址是192.168.1.2。然后A主机在自己的本地ARP缓存中检查主机B的IP地址(192.168.1.2)匹配MAC地址。
  • 第2步:如果主机A在ARP缓存中没有找到映射,它将询问192.168.1.2的硬件地址,从而将ARP请求帧广播到本地网络上的所有主机。源主机A的IP地址和MAC地址都包括在ARP请求中。本地网络上的每台主机都接收到ARP请求并且检查是否与自己的IP地址匹配。如果主机发现请求的IP地址与自己的IP地址不匹配,它将丢弃ARP请求。
  • 第3步:主机B确定ARP请求中的IP地址与自己的IP地址匹配,则将主机A的IP地址和MAC地址映射添加到本地ARP缓存中。
  • 第4步:主机B将包含其MAC地址的ARP回复消息直接发送回主机A。
  • 第5步:当主机A收到从主机B发来的ARP回复消息时,会用主机B的IP和MAC地址映射更新ARP缓存。本机缓存是有生存期的,生存期结束后,将再次重复上面的过程。主机B的MAC地址一旦确定,主机A就能向主机B发送IP通信了。

反向地址转换协议(RARP) 是局域网的物理机器从网关服务器的ARP表或者缓存上根据MAC地址请求IP地址的协议,其功能与地址解析协议相反。与ARP相比,RARP的工作流程也相反。首先是查询主机向网路送出一个RARP Request广播封包,向别的主机查询自己的IP地址。这时候网络上的RARP服务器就会将发送端的IP地址用RARP Reply封包回应给查询者,这样查询主机就获得自己的IP地址了。

当两台电脑重来没有通信过,这时候ping的过程:
网络通信-TCP协议网络通信的过程_第6张图片

打开浏览器访问百度的过程

假设所有东西都是第一次

  • 1、PC先确认一下有么有网关,如果没有网关直接访问不了(因为百度的ip不在本网段内),如果有,则先确认一下网关的Mac地址(使用ARP协议得到Mac地址)
  • 2、PC是以ip地址访问还是域名访问,如果是ip地址访问,接下来就是三次握手,三次握手成功后,客户端(浏览器)给服务器发送请求,服务器返回数据,客户端直接显示;如果是按域名访问,则:、
    • 1、先解析出baidu.com的IP地址
      • 1、发送ARP协议包获取默认网关的Mac地址
      • 2、组织数据发送给默认网关(ip是DNS服务器的ip,但是Mac地址是默认网关的Mac地址)
      • 3、默认网关拥有转发数据的能力,把数据转发给路由器
      • 4、路由器根据自己的路由协议,来选择一个合适的较快的路径,转发数据给目的网关
      • 5、目的网关(DNS服务器所在的网关)把数据转发给DNS服务器
      • 6、DNS服务器查询解析出baidu.com对应的ip地址,并将其原路返回给请求这个域名的客户端
    • 2、得到这个baidu.com对应的ip后,会发送tcp3次握手进行连接
    • 3、使用http协议发送请求给web服务器
    • 4、web服务器收到数据请求之后,通过查询自己的服务器得到相应的结果后返回给浏览器
    • 5、浏览器接收到数据后,通过浏览器自己的渲染功能来显示这个网页
    • 6、浏览器关闭tcp连接,4次挥手(结束)

TCP的3次握手

网上找了一张很便于理解的图,如下:
网络通信-TCP协议网络通信的过程_第7张图片

三次握手的过程:

  • 1、由客户端发起TCP连接请求【tcp_client_socket.connect((server_ip, server_port))】,其中报文中包括:seq序列号,由客户端随机生成,并将报文中的SYN标志位置1,表示需要建立TCP连接(SYN=1,seq=x,x为随机数),此时客户端进入SYN_SENT状态,等待服务器确认;
  • 2、服务器端接收到客户端的数据包后,由SYN=1知道请求建立连接,并向客户端发送确认TCP连接请求的报文,其中包括:seq序列号(有服务器端随机生成),并将SYN标志位置1,ACK标志位置1,ack字段在客户端发过来的seq值的基础上加1(SYN=1,ACK=1,ack=x+1,seq=y,x为客户端发过来的seq值,y是服务器端生成的随机数),此时服务器进入SYN_RCVD状态;
  • 3、客户端收到服务器端发送的TCP验证请求后,检查ACK是否为1,ack是否为x+1,如果正确,则将ACK标志位置1,ack=y+1,并将数据包发送给服务器,服务器检查ACK是否为1,ack是否为y+1,如果是,则连接建立成功,客户端和服务器进入ESTABLISHED状态,此时完成三次握手,随后就可以进行数据传输了!

三次握手过程中客户端和服务器端的状态变化
网络通信-TCP协议网络通信的过程_第8张图片

TCP的4次挥手

网络通信-TCP协议网络通信的过程_第9张图片

四次挥手的过程:

  • 1、客户端发送断开TCP连接的请求报文,并停止发送数据。发送的报文中,FIN标志位置1,表示请求断开连接,seq序列号由客户端随机生成(FIN=1,seq=x,其中x由客户端随机生成)
  • 2、服务器端收到客户端的请求报文,由FIN=1得知客户端请求断开连接,并发出确认报文,其中ACK标志位置1,ack字段在客户端发送的seq值的基础上加1(ACK=1,ack=x+1,seq=y,其中x是客户端发送的seq值,y由服务器随机生成)
  • 3、服务器端在回复完客户端的TCP断开请求后,不会马上进行TCP连接的断开,服务器端会先确保断开前,所有传输到客户端的数据是否传输完毕,一旦确认数据传输完毕,就会回复:FIN=1,ACK=1,ack=x+1,seq=z
  • 4、客户端收到服务器端的服务器端的断开连接请求(由FIN=1确定)后,发送确认报文。ACK标志位置1,ack为服务器端的seq值加1,seq序列号为服务器端的ack值

四次挥手过程的客户端及服务器端的状态变化
网络通信-TCP协议网络通信的过程_第10张图片

TCP三次握手和四次挥手的11个状态:

  • LISTEN:等待从任何远端TCP 和端口的连接请求。
  • SYN_SENT:发送完一个连接请求后等待一个匹配的连接请求。
  • SYN_RECEIVED:发送连接请求并且接收到匹配的连接请求以后等待连接请求确认。
  • ESTABLISHED:表示一个打开的连接,接收到的数据可以被投递给用户。连接的数据传输阶段的正常状态。
  • FIN_WAIT_1:等待远端TCP 的连接终止请求,或者等待之前发送的连接终止请求的确认。
  • FIN_WAIT_2:等待远端TCP 的连接终止请求。
  • CLOSE_WAIT:等待本地用户的连接终止请求。
  • CLOSING:等待远端TCP 的连接终止请求确认。
  • LAST_ACK:等待先前发送给远端TCP 的连接终止请求的确认(包括它字节的连接终止请求的确认)
  • TIME_WAIT:等待足够的时间过去以确保远端TCP 接收到它的连接终止请求的确认。
    • TIME_WAIT 两个存在的理由:
      • 1.可靠的实现tcp全双工连接的终止;
      • 2.允许老的重复分节在网络中消逝。
  • CLOSED:不在连接状态(这是为方便描述假想的状态,实际不存在)

TCP的长连接和短连接

TCP的短连接:

  • 1、客户端向服务端发起连接请求
  • 2、服务端收到请求后,双方建立连接(3次握手后)
  • 3、客户端向服务端发送数据
  • 4、服务端接收数据并处理后回应客户端
  • 5、一次读写完成后,此时双方任何一个发起close操作(一般是客户端发起close操作,当然不排除特殊情况)

操作步骤: 建立连接—>数据传输—>关闭连接…建立连接—>数据传输—>关闭连接

应用场景: WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。

优缺点: 短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。但如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。

TCP的长连接:

  • 1、客户端向服务端发起连接请求
  • 2、服务端收到请求后,双方建立连接(3次握手后)
  • 3、客户端向服务端发送数据
  • 4、服务端接收数据并处理后回应客户端
  • 5、一次读写完成后,连接不关闭
  • 6、继续读写操作…
  • 7、长时间操作后,发起客户端关闭请求

操作步骤: 建立连接—>数据传输…(保持连接)…数据传输—>关闭连接

应用场景: 长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。每个TCP连接都需要三次握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,再次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接,如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。

优缺点: 长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户来说,较适用长连接。client与server之间的连接如果一直不关闭的话,会存在一个问题,随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端需要采取一些策略,如关闭一些长时间没有读写事件发生的连接,这样可以避免一些恶意连接导致server端服务受损;如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接数,这样可以完全避免某个蛋疼的客户端连累后端服务。

TCP 和 UDP 的区别

  • 1、基于连接与无连接;UDP是无连接的( 写信 ),即发送数据之前不需要建立连接,TCP是面对连接的( 打电话 );
  • 2、TCP提供可靠的服务,保证数据正确性,UDP可能会丢包。TCP保证数据顺序,UDP不保证。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付(Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。)
  • 3、UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。
  • 4、TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信。
  • 5、TCP对系统资源要求较多,UDP对系统资源要求较少。

你可能感兴趣的:(网络通信,网络通信,tcp协议,tcp的三次握手和四次挥手,tcp通信的状态分析,tcp的长连接和短连接)