TCP/IP协议详解之 TCP协议学习笔记
一、TCP提供一种面向连接到、可靠的字节运输层服务。
面向连接指 双方 (广播或多播不能用于TCP )进行通信必须先建立Tcp连接。
可靠性指 1> 能够处理数据传输过程中被破坏问题;
2> 能够处理重复数据接收问题;
3> 能够发现数据丢失以及对此进行有效解决;
4> 能够处理接收端数据乱序到达问题。
可采用数据重传和数据确认应答机制来完成TCP 协议的可靠性数据传输。
TCP将用户数据打包构成报文段;它发送数据后启动一个定时器;另一端对收到的数据进行确认,对失序的数据重新排序,丢弃重复数据; T C P提供端到端的流量控制,并计算和验证一个强制性的端到端检验和。
二、TCP首部格式
注:下面表格来自网络!
序列号:TCP序号,即本报文段所发送的数据的第一个字节的序号。
确认号:即希望下次收到对方传送的数据的第一个字节的序号。
数据偏移:指出TCP报文段的数据起始处距离TCP报文段的距离,实际就是TCP头部长度。注意,数据偏移的单位不是字节而是32bit,即4字节。TVP首部最大长度为(2^4-1)*4=60字节。
保留:保留为今后使用,目前统一置为0.
代码位:
1、 URG:紧急比特。当URG=1时,表明紧急指针字段有效。该报文应尽快传送。而不要按原来的队列顺序来传送。
2、 ACK:确认比特。当ACK=1时确认号字段才有效,ACK=0时,表明确认号无效。
3、 PSH:推送比特:按对队传输到对方,不用待缓存填满后再提交给上层,而是立即提交。
4、 RST:复位比特。TCP连接中出现严重差错,必须立即释放并重新建立连接。也用于拒绝一个非法的报文段或拒绝打开一个连接。
5、 SYN:同步比特。在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对*同意建立连接,则应在响应的报文段中使用SYN=1和ACK=1。因此,SYN=1时,就表明这是一个连接请求或连接接受。
6、 FIN:终止比特。用来释放一个连接。当FIN=1时,表明数据发送完毕,要求释放连接
窗口:接收端告知自己的接收能力,即自己接收窗口的大小,发送方将按这个大小发送数据。
校验和:检验的范围包括首部和数据这两部分。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。
紧急指针:当紧急指针代码位被设置时为有效字段。如果有效,这个值指明了当前序列号的八位组的偏移值,即第一个非紧急数据的起始位置。
三、TCP连接的建立和终止
建立(三次握手)
三次握手的目的是同步连接双方的序列号和确认号并交换 TCP窗口大小信息。
1) 请求端(通常称为客户)发送一个SYN段指明客户打算连接的服务器的端口,以及初始序号(ISN,在这个例子中为1 4 1 5 5 3 1 5 2 1)。这个SYN段为报文段1。
2) 服务器发回包含服务器的初始序号的SYN报文段(报文段2)作为应答。同时,将确认序号设置为客户的ISN加1以对客户的SYN报文段进行确认。一个SYN将占用一个 序号。
3) 客户必须将确认序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认(报文段3)。
客户端 服务器端
终止(四次握手)
(1)客户端发送一个FIN(终止这个方向的连接),用来关闭客户端到服务器端的数据传送(报文段4)。
(2)服务器端收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。
(3)服务器端关闭与客户端的连接,发送一个FIN给客户端(报文段6)。
(4)客户端发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。
客户端 服务器端
1.为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?
这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的连接请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可能未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
2. 当一个服务器进程接受一个来自客户进程的服务请求时是如何处理端口的?如果多个连接请求几乎同时到达会发生什么情况?
T C P使用由本地地址和远端地址组成的4元组:目的I P地址、目的端口号、源I P地址和源端口号来处理传入的多个连接请求。T C P仅通过目的端口号无法确定那个进程接收了一个连接请求。另外,在三个使用端口2 3的进程中,只有处于L I S T E N的进程能够接收新的连接请求。处于E S TA B L I S HE D的进程将不能接收S Y N报文段,而处于L I S T E N的进程将不能接收数据报文段。