首页 > 系统相关 >Linux下网络编程

Linux下网络编程

时间:2022-11-05 11:31:07浏览次数:30  
标签:协议 IP 编程 网络 TCP 发送 Linux 服务器 客户端

Linux下网络编程

1.TCP/IP简介

       TCP/IP协议源于1969年,是针对Internet开发的一种体系结构和协议标准,目的在于解决异种计算机网络的通信问题。使得网络在互联时能为用户提供一种通用、一致的通信服务。是Internet采用的协议标准。

      TCP/IP是一组通信协议的代名词,是由一系列协议组成的协议簇。它本身指两个协议集:

    TCP(传输控制协议)。

    IP(互联网络协议)。

      TCP/IP协议的基本传输单位是数据包(Datagram)。

      TCP/IP传输协议,即传输控制/网络协议,也叫作网络通讯协议。它是在网络的使用中的最基本的通信协议。TCP/IP传输协议对互联网中各部分进行通信的标准和方法进行了规定。并且,TCP/IP传输协议是保证网络数据信息及时、完整传输的两个重要的协议。TCP/IP传输协议是严格来说是一个四层的体系结构,应用层、传输层、网络层和数据链路层都包含其中。

TCP/IP协议的基本传输单位是数据包(Datagram)。

TCP协议负责把数据分成若干个数据包,并给每个数据包加上包头,包头上有相应的编号,以保证在数据接收端能将数据还原为原来的格式。 IP协议在每个包头上再加上接收端主机地址,这样数据找到自己要去的地方,如果传输过程中出现数据丢失、失真等情况,TCP协议会自动要求数据重传。 

Linux下网络编程_TCP/IT

2.TCP/IP协议分层模型

  TCP/IP协议族是一组不同层次上的多个协议的组合。TCP/IP通常被认为是一个四层协议系统。

Linux下网络编程_TCP协议_02

  •  应用层(Application Layer)

     包含各种网络应用协议。如HTTP、FTP、telnet、SMTP、DNS、SNMP等。

  • 传输层(Transport Layer)

     负责在源主机和目的主机的应用程序间建立、管理和拆除可靠而又有效的端到端连接 。主要有TCP和UDP两个传输协议。

  • 网络互联层(Internet Layer)

     负责将分组独立地从信源传送到信宿,主要解决路由选择、拥塞控制和网络互联等问题。如最重要的协议——IP。

  • 网络接口层(Network Access Layer)

       负责将IP分组封装成适合在物理网络上传输的帧格式并传输;或将从物理网络接收到的帧解封,取出IP分组交给网络互联层。当前几乎所有的物理网络上都可运行TCP/IP协议。

3.传输控制协议

      传输层的服务允许用户按照传输层的数据格式分段及封装应用层送来的数据。这一层数据流提供了端到端的传输服务,它在发送主机与接收主机之间构建了一个逻辑连接 。它允许在Internet上两台主机之间信息的无差错传输。TCP还进行流量控制,以避免发送过快而发生拥塞。 

  • 传输层包括两个协议: 

TCP协议:即传输控制协议,是一个可靠的、面向连接的协议。

UDP协议:采用无连接的方式,不管发送的数据包是否到达目的主机,数据包是否出错。收到数据包的主机也不会告诉发送方是否正确收到了数据,它的可靠性是由上层协议来保障的。

3.1 传输控制协议TCP

       TCP协议, 即传输控制协议,是一个可靠的、面向连接的协议。所谓连接,就是两个对等实体为进行数据通信而进行的一种结合。面向连接服务是在数据交换之前,必须先建立连接。当数据交换结束后,则应终止这个连接。面向连接服务具有:连接建立、数据传输和连接释放这三个阶段。在传送数据时是按序传送的。

3.2 TCP数据格式

Linux下网络编程_TCP协议_03

3.3 三次握手

Linux下网络编程_三次握手_04

第一次握手:

       建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认。

第二次握手:

       服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。

第三次握手:

       客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。


  •  为什么握手是三次, 而不是两次或者四次?

       为了保证双方都具备收发能力,则双方都需要发送SYN和ACK,两次握手则只能确一方具备收发能力;三次握手则可刚好可确定双方都是可以进行收发的。

       第一次握手是客户端发送 SYN, 服务端接收, 服务端得出客户端的发送能力和服务端的接收能力都正常;

       第二次握手是服务端发送 SYN+ACK, 客户端接收, 客户端得出客户端发送接收能力正常, 服务端发送接收能力也都正常, 但是此时服务器并不能确认客户端的接收能力是否正常;

       第三次握手客户端发送 ACK, 服务器接收, 服务端才能得出客户端发送接收能力正常,服务端自 己发送接收能力也都正常。

3.4 四次挥手

Linux下网络编程_四次挥手_05

      TCP 一个特别的概念叫作半关闭, 这个概念是说, TCP 的连接是全双工(可以同时发送和接收) 连接, 因此在关闭连接的时候, 必须关闭发送和接收两个方向上的连接。

       第一次挥手: 客户端发出释放 FIN=1, 自 己序列号 seq=u, 进入 FIN-WAIT-1 状态。

       第二次挥手: 服务器收到客户端的后, 发出 ACK=1 确认标志和客户端的确认号 ack=u+1,自己的序列号 seq=v, 进入 CLOSE-WAIT 状态。

       第三次挥手: 客户端收到服务器确认结果后, 进入 FIN-WAIT-2 状态。 此时服务器发送释放 FIN=1 信号, 确认标志 ACK=1, 确认序号 ack=u+1, 自 己序号 seq=w, 服务器进入LAST-ACK(最后确认态)。

       第四次挥手: 客户端收到回复后, 发送确认 ACK=1, ack=w+1, 自 己的 seq=u+1, 客户端进入 TIME-WAIT(时间等待) 。 客户端经过 2 个最长报文段寿命后, 客户端 CLOSE;服务器收到确认后, 立刻进入 CLOSE 状态。

  • 为么需要四次挥手

      因为在断开连接时,服务器收到客户端断开请求时可能此时还没有完成数据传输,所以需要先回复客户端我收到你的请求了,等将数据传输完成后,再通知客户开端可以断开连接了,所以服务器需要将应答ack和FIN分两次发送,因此需要四次挥手。





标签:协议,IP,编程,网络,TCP,发送,Linux,服务器,客户端
From: https://blog.51cto.com/u_15688123/5825712

相关文章

  • 老资源分享之《Opengl游戏编程》代码
    徐明亮教授编写、同时应该也是他翻译的《3D游戏引擎》和《游戏物理学》  这本书的代码是以光盘提供的、鉴于现在人们都不用光盘了、那么贴个百度云链接吧: 链接:http......
  • 径向基函数神经网络(RBF)
    RBF网络模拟了人脑中局部调整、相互覆盖接收域(或称感受野,ReceptiveField)的神经网络结构,已证明RBF网络能以任意精度逼近任意连续函数。RBF网络的学习过程与BP网络的学习过程......
  • linux防火墙
    查看防火墙状态systemctlstatusfirewalld查看所有已开放的端口firewall-cmd--list-ports开放端口firewall-cmd--zone=public--add-port=82/tcp--permanent......
  • linux 环境nginx 快捷启动配置
    一般nginx安装后,得到nginx安装目录sbin文件夹里启动nginx/usr/local/nginx/sbin/nginx-sstart可以配置环境变量,来直接输入nginx来启动,停止,检测配置,重启1.编辑用户......
  • linux 打包指定动态链接库路径的方法
    #当前路径$PWDecho"current_path:"$PWD#父级路径$(dirname$PWD)echo"parent_path:"$(dirname$PWD)#套娃即可$(dirname$(dirname$PWD))echo"parent_parent_path:"......
  • Linux中redis启动修改密码操作
    启动在redis.conf同层目录下执行redis-serverredis.conf即可启动执行ps-ef|grepredis查看redis启动是否成功kill-985117停止redis redis-cli#连接本地r......
  • 【视频】CNN(卷积神经网络)模型以及R语言实现回归数据分析|附代码数据
    全文链接:http://tecdat.cn/?p=18149无人驾驶汽车最早可以追溯到1989年。神经网络已经存在很长时间了,那么近年来引发人工智能和深度学习热潮的原因是什么呢?(点击文末“阅读......
  • Linux Kernel 4.7版本发布
    在经历了长达一周的惬意假日时光,大神LinusTorvalds宣布面向所有GNU/Linux操作系统发布LinuxKernel4.7。Linux4.7内核的研发历经2个多月,自今年5月29日以来共计发布7......
  • linux shell 中实现基本的双循环
     001、[root@pc1test]#lsa.sh[root@pc1test]#cata.sh##测试程序#!/bin/bashfor((i=1;i<=3;i++))doecho"--------outerloop:$i--......
  • 极限编程简述
    转载:https://www.cnblogs.com/imyalost/p/7668838.html在敏捷方法中,极限编程(XP:eXtremeProgramming)是其中最著名的一个,它由一系列简单却互相依赖的实践组成。。。本篇博......