目录
2.tcp协议通信是全双工的,且双方地位对等。即通信双端既可以发送数据,又可以接收数据。
首先我们看到,tcp在网络协议栈是位于传输层,它的全称是"传输控制协议"。在发送端将数据包通过应用层(使用系统调用)交给传输层,再向下交付。在接收端将数据包从传输层向上交付交给应用层。
详谈tcp
报头剖析
有了上面的认识,接下来专门谈谈tcp协议,tcp报头如下。
1.端口号的作用是为了将报文发送给应用层指定的进程。
2.tcp协议通信是全双工的,且双方地位对等。即通信双端既可以发送数据,又可以接收数据。
3.确认应答机制
tcp协议要保证数据传输的可靠,确定性。即一个报文发给对端主机,发送端要知道对端是否真正收到了这个报文(可能在网络中丢包了),确认应答机制应运而生。
4.流量控制
流量控制指的是双端使用tcp协议时,发送端根据接收端的接收能力来判断每次发送报文的多少。
5.拥塞控制
两台主机在网络通信过程中,不仅要各自自身保证传输的可靠性、高效性,还要考虑到网络的拥塞状态。如果网络状态已经十分拥塞了,贸然向网络中发送大量数据会导致网络状态雪上加霜。
TCP连接和断开
连接:三次握手
在两台主机建立TCP连接时,需要通过三次握手来验证双端互发数据是否通畅,即A主机可以将数据成功发给B主机,B主机可以将数据成功发给A主机。
A主机主动建立连接,调用connect()向B主机发起SYN,B主机收到SYN后,给A主机发送ACK应答并一并向A主机发送SYN(捎带应答),A主机收到SYN再向B主机发送ACK应答,到此一个双向畅通连接建立成功。
断开:四次挥手
由于tcp通信是全双工的,tcp连接断开之前,两台主机要进行四次挥手,使得发送端到接收端的信道关闭,接收端向发送端的信道关闭。
在三次握手中,ACK应答和FIN通过捎带应答的方式合并了,但四次挥手中为什么没有合并呢?
首先,发送端应用层关闭套接字文件描述符,此时如果发送缓冲区内还有数据,则将剩余数据发送之后再向对端发送FIN表明要关闭单方向连接,即A发送端不再向B发送数据了,B端进行ACK应答表明FIN已收到,A到B单方向连接正式关闭。
同样,此时B端发送缓冲区内可能还有未发送完的数据,等待将发送缓冲区剩余数据发送之后再向对端发送FIN表明要关闭B到A的单方向连接,A端进行ACK应答表明FIN已收到,B到A单方向连接正式关闭。
由于断开时对端的数据可能还没发送完,所以中间两次报文合并的几率很小,而在建立连接时,要向对端建立连接,对端没有要等待的时间而导致时间不同步,就可以捎带应答将两次报文合并了。
网络编程Socket套接字,文件,传输层之间的联系
用一张图将linux文件系统和网络通信联系起来,linux内核使用各种结构体将一个的网络连接维护起来。