工作中学习的网络编程知识,并及时总结
参考书籍《UNIX网络编程卷1:套接字联网API(第三版)》
概述
以下皆是在Unix系统下讨论与测试。
TCP/IP协议族,多台计算机间想通过网络通信、传输数据,就得要确定通信双方的所用的网络协议(protocol)。
其中TCP/IP协议族,也称为网际协议族,举例来说,web客户与服务器之间使用TCP通信,TCP转而使用IP通信,IP再通过某种形式的的数据链路层通信,如果客户与服务器在同一个以太网上,那么就有图所示的网络通信层次:(引用UNIX网络编程卷1:套接字联网API第三版)
从上面网络协议的分层结构中,看到TCP仅仅是传输层的协议,整个协议族中还包含其他的成员,这里重点讨论的也是TCP通信。
套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。
UDP
user data protocol,用户数据报协议,是一个简单的传输层协议。
数据流
应用程序往一个udp套接字写入一个消息,该消息随后被封装到一个UDP数据报,该数据报进而被封装成一个IP数据报,然后发送到目的地。
特性
UDP是无连接服务,即不可靠的,具体如下:
不保证数据报到达目的地;
不保证数据报的先后顺序;
也不确定数据报的是否重复发送;
每个数据报都有一个长度,会随着数据报一道发送至接收端。
TCP
transmission control protocol,是传输控制协议,也属于传输层协议。
数据流
发送端数据的封装过程如下图所示:
接收端数据分用过程:
特性
TCP提供的是面向连接的可靠服务:
确认机制,TCP保持首部和数据的校验和,可以检验数据报的正确性,如果错误就丢弃,不确认。序列号也是每个字节数据的编号,可以排序、 去重。每次接收端收到数据后,都会对传输端进行确认应答,就是发送ack报文,这个报文带有对应的确认序列号,告诉对方接收了哪些数据,下一次从哪发。
重传机制,在发送一个数据段的同时启动一个重传定时器,如果在重传超时前收到确认就关闭该重传,如果没有收到确认,则重传该数据段。在选择重传时间过程,TCP必须具有自适应性,根据互联网的实际情况来调整重传时间。
拥塞控制,含有用于动态估算客户和服务之间的往返时间(round-trip time,RTT)的算法,以便知道等待一个确认需要多少时间。提供流量控制(flow control),TCP总是告知对端在任何时刻它一次能够从对端接收多少字节数据,这也称之为通告窗口。
TCP的连接跟终止
三路握手流程
为啥需要三路握手
三次握手最主要目的是保证连接是全双工的
为啥说三次握手就能保证连接是全双工的
为了保证服务端能接受到客户端的信息并做出正确应答而进行前两次握手,为了保证客户端能够接收到服务端信息并做出正确应答而进行后两次握手。
四次挥手流程
为啥需要四次挥手
前两次是主动关闭端(A)通知对端(B),B正常应答,这时只确定A不再发送数据,B不再接收数据。因为TCP是全双工的连接,不再发送数据并不代表它不能接收对端数据,所以前两次挥手后,A还是可以继续等待接收数据,B可以继续发送数据。这就需要后两次挥手,使得B不再发送数据,A不再等待数据。
TCP状态转移图
TCP涉及连接建立和终止的操作可以用状态转移图来说明:
作者能力有限,如有错误,欢迎及时指出!
下一篇 写socketAPI函数。
以上理论是作者总结自《UNIX网络编程卷1:套接字联网API第三版》,作者:W.Richard Stevens, Bill Fenner, Andrew M.Rudoff,仅供学习讨论!