面向连接,可靠传输,面向字节流
TCP协议
面向连接
accept:获取新连接
1.当调用accept之后,内核就会为新连接创建一个套接字描述符,服务端使用该套接字描述符进行和客户端进行数据通信
2.连接建立之后,双方都可以发送数据
确认msg1:确认的行为是传输层TCP协议的行为,不是应用层的行为,当确认之后,确认的数据就缓存在TCP的接收缓冲区
应用层可以调用recv函数从接收缓冲区中拷贝数据
MSL:最大报文段生存时间,指的是发送方认为TCP报文在网络中的最大生存时间
2MSL = 丢失ACK的MSL + 重传FIN的MSL
地址复用问题
如果一个TCP服务端程序需要立即重启一个服务端程序,再重启的过程需要绑定端口。由于连接状态并没有变成CLOSED,服务器断开连接,就会产生TIME_WAIT状态,在2MSL时间里,内核会拿着端口,等待2MSL这个行为是TCP行为,即使程序退 出,内核还占用着对应端口。
解决方法:int setsockopt(int sock, int level, int optname, const void* optval, socklen_t len)
目的端口:接收方在进行数据分用的时候,传输层TCP协议通过端口,可以将数据提交给指定侦听的应用层程序,传输层在通过目的端口来区分数据属于那一个进程
32位序号:标识TCP源端向TCP目的端发送数据字节流
32位确认序号:标识TCP目的端期望TCP源端的下一个请求序号
注意:
1.在TCP通信过程中,客户端和服务端各维护一套序号
2.在消息接收方需要确认接收的数据进行确认,在确认的时候,需要组织确认序号,确认序号是期望对方发送的下一个序号
3.在TCP数据传输过程当中,ACK数据包并不会消耗序号
对于一次三次握手而言,双方在发送第一个数据包的时候,是在协商彼此的起始序号的位置,对于每一个连接双方而言,自己管理的序号不一定是从0开始
对于发送数据而言,整体消耗的序号 = 起始序号 + 数据长度 -1,确认序号 = 起始序号+数据长度
4位首部长度
0000~1111(0x00~0xf)
首部长度字节大小 = 4*15 = 60 --》TCP协议头部最大字节60字节
6为保留位
6个标志位
URG紧急标志位:配合紧急指针来使用
ACK标志位:表示确认数据
PHS标志位:表示发送数据
RST标志位:重置连接
SYN:发起连接
FIN:断开连接
16位窗口大小:2字节数据,窗口范围(0-2^16)
16位校验和:检验数据是否完成
16位紧急指针:和URG标志位一起使用,如果URG标志位为1,则紧急指针指向的数据有效
选项:剩余40个字节,可以加上一些选项,比如MSS最大报文段长度