為啥當(dāng)我用一個(gè)tcp客戶端和指定一個(gè)不存在的端口去連接任意一臺(tái)已知已經(jīng)啟動(dòng)的主機(jī)后,并不能得到ECONNREFUSED這個(gè)錯(cuò)誤呢?但是當(dāng)我同樣訪問(wèn)我自身機(jī)器上的一個(gè)不存在的服務(wù)端口后,立刻就返回ECONNREFUSED錯(cuò)誤了,這是什么原因?
如果兩臺(tái)機(jī)器運(yùn)行在同一個(gè)局域網(wǎng),則客戶端訪問(wèn)服務(wù)器一個(gè)不存在的端口時(shí),服務(wù)器返回的RST分段會(huì)立刻讓客戶端的connect調(diào)用返回ECONNREFUSED錯(cuò)誤,但是當(dāng)客戶端位于NAT之后的話,當(dāng)訪問(wèn)服務(wù)器一個(gè)不存在的端口時(shí),服務(wù)器雖然仍返回RST,但是客戶端的connect卻并不立刻返回ECONNREFUSED錯(cuò)誤了,而是持續(xù)發(fā)送SYN,直到超時(shí)發(fā)生后,最終返回ETIMEDOUT錯(cuò)誤,這樣做的理由是什么?
重點(diǎn):ECONNREFUSED錯(cuò)誤這是個(gè)連接被服務(wù)器拒絕,為啥呢,是端口不存在的原因,換一個(gè)端口就好了。