Unix Network Programming(4)---TCP
2015-10-22 14:41
267 查看
TCP—传输控制协议(Transmission Control Protocol),是一种面向连接的,向用户进程提供可靠的全双工字节流的协议。TCP套接字是一种流套接字(stream socket)。TCP关心确认、超时和重传之类的细节。大多数网络应用都使用TCP。TCP既可以使用IPv4,也可以使用IPv6。
可靠性:返回确认,超时重传等技术。
流量控制:TCP总是告知对端在任何时刻它一次能够从对端接收多少字节的数据,这称为通告窗口(advertised window)。该窗口时刻动态变化。
全双工:在一个给定的连接上应用可以在任何时刻在进出两个方向上既发送数据又接收数据。因此TCP必须为每个数据流方向跟踪诸如序列号,通告窗口大小等状态信息。建立一个full duplex连接后,需要的话可以把它转化城一个单工连接。
排序:TCP通过给其中每个字节关联一个序列号,对所发送的数据进行排序。TCP接收端还可以对数据进行查重,丢弃重复的数据。
客户通过调用connect发起主动打开(active open)。客户发送SYN同步分节,它告诉服务器客户将在连接中发送的数据的初始序列号。通常SYN不携带数据,其所在IP数据报只含有一个IP首部,一个TCP首部及可能有的TCP选项。
服务器必须确认(ACK)客户的SYN,同时自己发送一个SYN分节,它含有服务器将在同一连接中发送数据的初始序列号。
客户必须确认服务器的SYN。
ACK中的序列号,是发送这个ACK的一端期待的下一序列号。每个SYN占据一个序列号空间,所以ACK的确认号就是该SYN的序列号加一。
MSS选项。最大分节大小(maximum segment size),套接字选项TCP_MAXSEG可以提取设置这个选项。
窗口规模选项。TCP连接任何一端能够通告对端的最大窗口大小位65535,因为在TCP首部中相应字段占16位。然而当今普及的高速网络连接要求更大的窗口以获得更大的吞吐量,所以这个选项必须左移。套接字选项SO_RCVBUF影响这个TCP选项。使用这个选项的前提是它的两个端系统必须都支持这个选项。(recall–协商使用规则)
时间戳选项。对于高速网络是必须的,它可以防止失而复现的分组可能造成的网络破坏,也类似于窗口规模选项的方式写上处理,一般无需考虑它。
1. 某个应用进程首先调用close,称之为主动关闭(active close)。该端的TCP于是发送一个FIN分节,表示数据发送完毕。
2. 接收到这个FIN的对端执行被动关闭(passive close)。这个FIN由TCP进行确认(ACK)。这个FIN的接收,也会作为一个文件结束符(end-of-file)传递给接收端应用(放在已排队的数据之后),FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
3. 一段时间后,接收到文件结束符的应用进程会调用close关闭它的套接字。它的TCP也会发送一个FIN。
4. 原发送端的TCP发送ACK来确认FIN。
步骤2,3之间,从执行被动关闭的一端到执行主动关闭的一端流动数据使可能的,这称为半关闭(half-close),shutdown函数会进行详细说明。
MSL是任何IP数据报能够在因特网中存活的最长时间。这个时间是有限的,因为每个数据报中都含有一个称为跳限的8位字段,我们假设拥有最大跳限(255)的分组在网络中存在的时间不可能超过MSL秒。
TIME_WAIT状态存在的两个理由:
1. 可靠地实现TCP全双工连接的终止;
2. 允许老的重复分节在网络上消逝。
TCP概要
面向连接:TCP客户先于某个给定服务器建立一个连接,再跨越该连接与那个服务器交换数据,然后终止这个连接。可靠性:返回确认,超时重传等技术。
流量控制:TCP总是告知对端在任何时刻它一次能够从对端接收多少字节的数据,这称为通告窗口(advertised window)。该窗口时刻动态变化。
全双工:在一个给定的连接上应用可以在任何时刻在进出两个方向上既发送数据又接收数据。因此TCP必须为每个数据流方向跟踪诸如序列号,通告窗口大小等状态信息。建立一个full duplex连接后,需要的话可以把它转化城一个单工连接。
排序:TCP通过给其中每个字节关联一个序列号,对所发送的数据进行排序。TCP接收端还可以对数据进行查重,丢弃重复的数据。
TCP连接的建立和终止
三次握手
服务器要准备好接收外来连接。这要通过调用socket、bind和listen这3个函数来完成,称之为被动打开(passive open)。客户通过调用connect发起主动打开(active open)。客户发送SYN同步分节,它告诉服务器客户将在连接中发送的数据的初始序列号。通常SYN不携带数据,其所在IP数据报只含有一个IP首部,一个TCP首部及可能有的TCP选项。
服务器必须确认(ACK)客户的SYN,同时自己发送一个SYN分节,它含有服务器将在同一连接中发送数据的初始序列号。
客户必须确认服务器的SYN。
ACK中的序列号,是发送这个ACK的一端期待的下一序列号。每个SYN占据一个序列号空间,所以ACK的确认号就是该SYN的序列号加一。
TCP选项
每一个SYN可以含有多个TCP选项。MSS选项。最大分节大小(maximum segment size),套接字选项TCP_MAXSEG可以提取设置这个选项。
窗口规模选项。TCP连接任何一端能够通告对端的最大窗口大小位65535,因为在TCP首部中相应字段占16位。然而当今普及的高速网络连接要求更大的窗口以获得更大的吞吐量,所以这个选项必须左移。套接字选项SO_RCVBUF影响这个TCP选项。使用这个选项的前提是它的两个端系统必须都支持这个选项。(recall–协商使用规则)
时间戳选项。对于高速网络是必须的,它可以防止失而复现的分组可能造成的网络破坏,也类似于窗口规模选项的方式写上处理,一般无需考虑它。
TCP连接终止
终止一个连接通常需要4个分节。(recall通常)1. 某个应用进程首先调用close,称之为主动关闭(active close)。该端的TCP于是发送一个FIN分节,表示数据发送完毕。
2. 接收到这个FIN的对端执行被动关闭(passive close)。这个FIN由TCP进行确认(ACK)。这个FIN的接收,也会作为一个文件结束符(end-of-file)传递给接收端应用(放在已排队的数据之后),FIN的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
3. 一段时间后,接收到文件结束符的应用进程会调用close关闭它的套接字。它的TCP也会发送一个FIN。
4. 原发送端的TCP发送ACK来确认FIN。
步骤2,3之间,从执行被动关闭的一端到执行主动关闭的一端流动数据使可能的,这称为半关闭(half-close),shutdown函数会进行详细说明。
TCP状态转换图
TIME_WAIT状态
执行主动关闭的一端在连接终止的最后要经历这种状态,该端点停留在这个状态的持续时间是最长分节生命期MSL的两倍,称为2MSL。MSL是任何IP数据报能够在因特网中存活的最长时间。这个时间是有限的,因为每个数据报中都含有一个称为跳限的8位字段,我们假设拥有最大跳限(255)的分组在网络中存在的时间不可能超过MSL秒。
TIME_WAIT状态存在的两个理由:
1. 可靠地实现TCP全双工连接的终止;
2. 允许老的重复分节在网络上消逝。
相关文章推荐
- TCP/IP协议族—OSI参考模型1
- Python网络爬虫(1)--url访问及参数设置
- tcp断开的4次挥手
- HttpClient(联网)
- IO的阻塞与非阻塞、同步与异步以及Java网络IO交互方式
- Socket使用
- 【Linux/unix网络编程】之使用socket进行TCP编程
- tcp连接的3次握手
- Linux网络流量实时监控ifstat iftop命令详解(系列二)
- 遗传算法和bp神经网络结合(神经网络权值学习)
- Iterate HTTP request headers
- 虚拟机的网络
- Volley + https
- 操作系统与网络实现 之五
- NFS(网络文件系统)简单总结
- Mac OS X 更新到10.11后cocoapods安装出现的问题(- bad response Not Found 404 (http://ruby.taobao.org/latest_spe)
- http接口自动化测试框架实现
- Nginx调试日志[emerg]: invalid log level “debug_http” in /path/conf/nginx.conf:XX
- okHttp使用中报Could not find method java.nio.file.Files.newOutputStreamo警告问题
- 解决CentOS 7 开机网络设备不启动方法