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传输协议是严格来说是一个四层的体系结构,应用层、传输层、网络层和数据链路层都包含其中。

2.TCP/IP协议分层模型

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

编程

应用层(Application Layer)

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

传输层(Transport Layer)

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

网络互联层(Internet Layer)

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

网络接口层(Network Access Layer)

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

3.传输控制协议TCP

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

3.1 TCP数据格式

编程

3.2 三次握手

编程

第一次握手:

建立连接时,客户端发送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.3 四次挥手

编程

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分两次发送,因此需要四次挥手。

审核编辑 黄昊宇
 


 



 


 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分