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就是空余的座位
一个座位对应一个客人
那么这里就涉及到了 如果是多个客人同时访问一个座位的情况
这个会在接下来的的多线程网络编程中讲到