【Linux】TCP网络编程流程

TCP网络编程流程

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

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

在这之前我们先要了解TCP

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

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

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

【Linux】TCP网络编程流程_第1张图片

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

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

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

TCP网络编程基本流程

【Linux】TCP网络编程流程_第2张图片

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

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

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

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

【Linux】TCP网络编程流程_第3张图片

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

 【Linux】TCP网络编程流程_第4张图片

 【Linux】TCP网络编程流程_第5张图片

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

 【Linux】TCP网络编程流程_第6张图片

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

三次握手

 

第一次握手:客户端给服务端发一个 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 状态。
例如我们启动客户端和服务器并建立连接

【Linux】TCP网络编程流程_第7张图片

【Linux】TCP网络编程流程_第8张图片

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

 【Linux】TCP网络编程流程_第9张图片

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

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

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

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

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

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

一个座位对应一个客人

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

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

 

你可能感兴趣的:(计算机网络,网络,tcp/ip,linux)