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
过程:服务器调用socket,bind,listen完成初始化后,调用accept()阻塞等待,处于监听端口的状态。客户端调用socket初始化后,调用connect发送SYN段并且阻塞等待服务器应答,服务器应答一个SYN-ACK段,客户端收到后从connect()返回,同时应答一个ACK段,服务器收到后从accept()返回。
关闭: A-> FIN -> 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 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。
相关文章推荐
- http 头信息详解(转)
- Socket套接字/TCP
- 图解TCP/IP读书笔记(一)
- VRRP详解
- 判断Http请求由手机端发起,还是有电脑端发起
- 初识Winsock之美
- HTTP协议状态码详解(HTTP Status Code)(转)
- HTTP头信息详解2-转
- 【android-async-http】官方文档学习笔记
- [连载]《C#通讯(串口和网络)框架的设计与实现》-2.框架的总体设计
- 【PHP】$_POST, $HTTP_RAW_POST_DATA, and php://input
- HTTP头信息(转)--2
- HTTP头信息(转)--1
- Go语言HTTP测试及程序性能调优
- Http参数相关
- Fiddler网络拦截一
- cocos2dx异步网络UI界面更新设计
- 用 Java 实现断点续传 (HTTP)
- 网络工程实训终期
- 20135306黄韧[2.72 2.77 3.70](http://i.cnblogs.com/EditPosts.aspx?opt=1)