一、OSI七层模型

tcp发送response包 tcp发送报文_网络



二、名词解释

1、MTU(Maximum Transmission Unit)

最大传输单元,在数据链路层中,往往规定了MTU大小,IP层的数据包通过数据链路层如果大于MTU,将被分片,到达接收端IP层后再被重组。以太网的MTU为1500字节。

2、MSS(Maximum Segment Size)

最大报文段,是TCP协议的一个选项。MSS选项用于在TCP建立连接时,收发双方协商一个TCP报文段所能承载的最大数据长度。选择合适的MSS很重要。如果MSS小了,网络利用率低。如果MSS大了,由于在网络层需要分片,也会影响网络性能。一般MSS的长度为MTU(1500)-IP首部(20)-TCP首部(20)=1460字节。



三、TCP套接字发送流程

tcp发送response包 tcp发送报文_java_02

每一个TCP套接字都有一个发送缓冲区和接收缓冲区(大小可以由SO_SNDBUF和SO_RCVBUF设置),这个套接字缓冲区是在内核中的。

发送:
1、当我们调用write将数据写入套接字的时候,数据被传入内核放入套接字发送缓冲区。如果缓冲区已满那么write函数将被阻塞,直到数据全部被传入内核的套接字缓冲区中(需要注意的是当write返回的时候并不代表对端已经收到了这些数据,只是说明这些数据被写到了内核中的缓冲区里面)。
2、当数据到达内核中以后,内核中的TCP程序会对其进行一次加工,将数据以MSS(maximum segment size)大小分块,并给每个数据块安上一个TCP首部,随后发给IP程序。
3、IP程序可能会对数据进行进一步的分片,取决于MSS的大小,有的系统在实现中使用了路径MTU发现机制,会尽量减少分片的情况。通用的做法就是给数据包加上IP头,按照其目的IP地址查找路由表确定网络接口,然后传递给数据链路层。
4、数据链路层中会维护一个队列,如果队列已满,则会沿协议栈返回一个错误,最终由TCP捕获这个错误,并重传该数据。

接收:
1、接收缓冲区被TCP用来保存接收到的数据,直到应用程序来读取。对于TCP来说,接收缓冲区中可用空间的大小限定了TCP通告对端的窗口大小。

注意:

1、TCP缓冲区一个很重要的问题就是何时从套接字缓冲区中将已发送的数据丢弃,我们知道TCP是一个可靠的传输协议,当对端确认数据到达的ack返回时,则认定发送的数据已经被对方接受,此时内核中的套接字缓冲区才会将数据删除,在确认的ack到达之前,内核的套接字缓冲区中会为数据维护一个副本,防止数据由于损坏或者丢失造成重传的时候内核已经将其删除了。

2、TCP套接字缓冲区和TCP滑动窗口的区别。