TCP协议格式

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值