您的位置:首页 > 理论基础 > 计算机网络

TCP协议格式

2015-11-22 22:38 381 查看
TCP协议

协议格式

0 16 31

|16位源端口 | 16位目标端口|

| 32位序号 |

| 32位确认序号 |

|4位首部长度|保留(6位)|URG|ACK|PSH|RST|SYN|FIN|16位串口大小|

|16位校验和| 16位紧急指针|

|选项|

|数据|

解析:

16位窗口大小用于流量控制。

16位校验和:将协议头和数据都计算在内。

16位紧急指针:紧急数据在数据包中偏移,紧急数据一般放在包尾。

4位首部长度:以4字节为单位,最长60字节,最短20字节。

URG:紧急数据,一般置0。

ACK:1包含应答信息,0不包含应答信息。

PSH:1包内含数据,0此包为空包。

RST:1进程结束或无此进程,一般置0.

SYN:1建立链接,一般置0.

FIN:1关闭连接,一般置0.

在数据传输过程中,ACK和确认序号非常重要。应用程序交给TCP协议发送的数据会暂存在TCP层的发送缓冲器中,发送给对方数据后,只有收到对方应答的ACK段才知道该数据发到了对方,可以从发送缓冲区中释放掉了。如果因为网络故障丢失了数据包或者丢失了对方发回的ACK段,经过等待超时后TCP协议自动将发送的缓冲区中的数据包重发。

连接建立与关闭

三次握手:A-> SYN -> B

A<- SYN|ACK <- B


A-> ACK -> B


过程:服务器调用socket,bind,listen完成初始化后,调用accept()阻塞等待,处于监听端口的状态。客户端调用socket初始化后,调用connect发送SYN段并且阻塞等待服务器应答,服务器应答一个SYN-ACK段,客户端收到后从connect()返回,同时应答一个ACK段,服务器收到后从accept()返回。

关闭: A-> FIN -> B

A<- ACK <- B


...


A<- FIN <- B


A-> ACK -> B


如果客户端没有更多的请求了,就调用close()关闭连接,就像写端关闭管道一样,服务器的read()返回0(收到FIN段),这样服务器就知道客户端关闭连接了(回复ACK,处理完自身事情后),也调用close()关闭连接。

注意:任何一方调用close()后,连接的两个传输方向都关闭,不能再发送数据了。如果一方调用shutdown()则链接处于半关闭状态,仍可接收对方发来的数据。

注:1. 回执包含在发送包中,节省网络传输时间。

2. 每次连接的首个数据包的起始序号应该比该端口的上次序号(结束连接)大。以此辨认上次错误回复包。

3. SYN位和FIN位也要占用一个序号。

4. 主动关闭连接方处于Time-wait状态。

5. 每发送一个字节,序号加1;发送10字节,序号要增加10。

RST示例:

在TCP通讯中,如果一方收到另一方发来的段,读出其中的端口号,发现本机并没有任何进程使用这个端口,就会应答一个RST位的段给另一方。例如,服务器并没有进程使用8080端口,客户端telnet连接它,服务器收到客户端发来的SYN段就会应答一个RST段,客户端收到RST段后报告错误:Connection refused。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: