如何理解tcp是面向连接,udp是无连接

如何理解tcp是面向连接,udp是无连接

作者:admin |  时间:2014-02-17 |  浏览:519 |  0 条评论

问及tcp,udp的区别,稍微懂一些网络协议的人都会说tcp是面向连接的而udp是无连接的。

那到底如何还理解这里的连接呢?tcp/ip又是如何实现的?

实践是最好的方法。首先看下tcp如何三次握手。

[redfoxzheng@~ 17:31:04]$ netcat -l -p 10001 -s 10.6.207.88

[redfoxzheng@~ 17:28:56]$ telnet 10.6.207.88 10001

[redfoxzheng@~ 17:27:59]$ sudo /usr/sbin/tcpdump -i eth1 port 10001

输出如下:

1>>>17:31:17.291631 IP 10.6.207.32.49920 > 10.6.207.88.scp-config: S 1285475417:1285475417(0) win 5840 <mss 1460,sackOK,timestamp 758276028 0,nop,wscale 2>
2>>>17:31:17.291826 IP 10.6.207.88.scp-config > 10.6.207.32.49920: S 500699789:500699789(0) ack 1285475418 win 5792 <mss 1460,sackOK,timestamp 3020341516 758276028,nop,wscale 2>
3>>>17:31:17.291848 IP 10.6.207.32.49920 > 10.6.207.88.scp-config: . ack 1 win 1460 <nop,nop,timestamp 758276028 3020341516>

第一次握手,10.6.207.32向10.6.207.88发了一个syn同步包。其中包含哪些信息呢?首先是1285475417:1285475417(0)序列号。tcp协议中有过定义,tcp对传输的每一个字节都分配了一个序列号。由于这是一个syn包,没有有效载荷的数据,因此括号中是0。win5840,通知10.6.207.88发送方的滑动窗口大小。mss1460,表示mtu大小。

第二次握手,10.6.207.88给10.6.207.32回了一个ack应答包。500699789:500699789(0) 含义同上。ack 1285475418 这个就是syn包序列号+1。win,mss含义相同。

第三次握手,10.6.207.32给10.6.207.88回了一个ack应答包。至此tcp连接建立成功。

再看一下是如何传输的。

在telnet终端输入三个a,回车。

1>>>17:45:37.504348 IP 10.6.207.32.49920 > 10.6.207.88.scp-config: P 1:6(5) ack 1 win 1460 <nop,nop,timestamp 758491059 3020341516>
2>>>17:45:37.504526 IP 10.6.207.88.scp-config > 10.6.207.32.49920: . ack 6 win 1448 <nop,nop,timestamp 3020556564 758491059>
对于第一行,我们抓包看到88收到来自32的数据包。数据包大小是1:6(5),5个字节,这里包含了回车换行。P表示PSH设置为1,告诉内核将数据尽快交给应用层。

不要奇怪为什么还有第二行。32给88回了一个ack应答包。这里就体现了tcp是面向连接的。32给88回一个ack告诉88这个包已经收到,且是正确的,ack 6。

也就是说tcp传输段数据至少要有两个包。ack这个包可能会和数据包合并。

下面看下tcp如何关闭连接。

1>>>17:52:18.958059 IP 10.6.207.32.49920 > 10.6.207.88.scp-config: F 6:6(0) ack 1 win 1460 <nop,nop,timestamp 758591416 3020556564>
2>>>17:52:18.958242 IP 10.6.207.88.scp-config > 10.6.207.32.49920: F 1:1(0) ack 7 win 1448 <nop,nop,timestamp 3020656929 758591416>
3>>>17:52:18.958260 IP 10.6.207.32.49920 > 10.6.207.88.scp-config: . ack 2 win 1460 <nop,nop,timestamp 758591416 3020656929>

tcp关闭连接需要四次握手,这里我们抓到只有3个包,主要是将第二个fin包和ack包合并了。

32发送一个fin包给88, 88收到fin包,应该发一个ack给32,然后再发一个fin包。这里将这两个包合并。最后32收到88的fin包,发送一个ack,至此连接完全关闭。

再看下udp传输。

[redfoxzheng@~ 17:52:18]$ netcat -l -u -p 10001 -s 10.6.207.88

[redfoxzheng@~ 17:57:13]$ netcat -u 10.6.207.88 10001

aaa

tcpdump输出:

17:58:10.559974 IP 10.6.207.32.32824 > 10.6.207.88.scp-config: UDP, length 4

32就把这个udp包扔给了88。其中不涉及到任何双方的校验。

本文标签:

发表评论

电子邮件地址不会被公开。

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>