【Linux】TCP网络编程流程

TCP网络编程涉及三次握手建立连接和四次挥手关闭连接。在连接过程中,通过SYN和ACK确认确保可靠性。利用滑动窗口协议进行流量控制,以及AIMD算法进行拥塞控制。连接后,双方可全双工传输数据。断开时,客户端和服务器通过FIN和ACK报文进行挥手过程。

TCP网络编程流程

上一节博文我们提到了网络编程的基本流程

现在我们来了解TCP网络编程的流程

在这之前我们先要了解TCP

首先TCP是一种传输控制协议

在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的传输层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。

应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分割成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传送单元(MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个字节一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算和校验。

首先,TCP建立连接之后,通信双方都同时可以进行数据的传输,其次,它是全双工的;在保证可靠性上,采用超时重传和捎带确认机制。

在流量控制上,采用滑动窗口协议,协议中规定,对于窗口内未经确认的分组需要重传。

在拥塞控制上,采用广受好评的TCP拥塞控制算法(也称AIMD算法),该算法主要包括三个主要部分:1,加性增、乘性减;2,慢启动;3,对超时事件做出反应。

TCP网络编程基本流程

编程流程和上一节网络编程流程一致

但是TCP编程中涉及到了在传输方面的问题 

TCP是一个网络之间的传输协议

那么这里就涉及到了 三次握手 四次挥手 

网络编程中通过三次握手建立连接 

 

 

然后三次握手完成之后通过四次挥手关闭一个TCP的连接

 

这是面经中关于三次握手和四次挥手的表述

三次握手

 

第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN(c)。此时客户端处于 SYN_Send 状态。

第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(s),同时会把客户端的 ISN + 1 作为 ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_RCVD 的状态。

第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 established 状态。服务器收到 ACK 报文之后,也处于 established 状态,此时,双方以建立起了链接。

四次挥手:

第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于FIN_WAIT1状态。

第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 + 1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT状态。

第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态。

第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 + 1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态。
例如我们启动客户端和服务器并建立连接

我们从客户端发出数据 查看一下服务器端的响应

 

可以看到成功接收到了来自客户端的数据

前提是我们的客户端中的 ip地址要和我们自己建立的服务器ip地址一致

如果想要和别的主机建立连接我们只需要改变ip地址即可

套接字的作用就是相当于 把门的 只有通过sockfd才能连接上内部的线程

然后accept就是和其它客户端建立联系的关键

如果把客户端比作来餐厅吃饭的客人 那么accept就是空余的座位

一个座位对应一个客人

那么这里就涉及到了 如果是多个客人同时访问一个座位的情况

这个会在接下来的的多线程网络编程中讲到 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值