# TCP 3-way handshake, flags आणि connection close

Source: https://ravindrabagale.com/mr/cyber/part-01/ch03-osi-model-tcp-ip-model-tcp-vs-udp-and-the-3-way/3-5-the-tcp-3-way-handshake-tcp-flags-and.html
Language: mr (Marathi with English technical terms)

TCP connection तयार होण्याआधी दोन्ही machines sequence numbers आणि connection state समन्वयाने ठरवतात. SYN → SYN-ACK → ACK हा क्रम पक्का लक्षात ठेवा. Wireshark analysis, firewall states आणि SYN-related security topics याच पायावर समजतात.

   Client (192.168.56.10:51544)                 Server (192.168.56.101:80)
        |  1. SYN        seq=1000                        |
        | ---------------------------------------------> |   "I want to talk"
        |  2. SYN-ACK    seq=5000, ack=1001              |
        | <--------------------------------------------- |   "OK, I heard you"
        |  3. ACK        seq=1001, ack=5001              |
        | ---------------------------------------------> |   connection ESTABLISHED
        |        ... data (PSH/ACK) both ways ...        |
        |  FIN  ---------------------------------------> |   4-way close:
        |  <---------------------------------------  ACK |   FIN, ACK, FIN, ACK
        |  <---------------------------------------  FIN |
        |  ACK  ---------------------------------------> |

Client seq=1000 असलेला SYN पाठवतो.

Server seq=5000, ack=1001 असलेला SYN-ACK देतो.

Client seq=1001, ack=5001 असलेला ACK देतो. Connection established होतं.

SYN sequence space मध्ये एक number वापरतो, म्हणून या example मध्ये ack एकने पुढे आहे. सामान्य data मध्ये ACK पुढे अपेक्षित असलेला byte number सांगतो; तो प्रत्येक वेळी फक्त seq + 1 असेलच असं नाही.

महत्त्वाचे flags

 | Flag
 | अर्थ
 | कुठे दिसतो?

 | SYN
 | Sequence numbers synchronize करून connection सुरू करणे
 | Handshake step 1 and 2, SYN scan (nmap -sS)

 | ACK
 | मिळालेल्या data ची acknowledgement
 | Established connection मधल्या segments वर साधारणपणे

 | FIN
 | Graceful close—माझ्याकडून पाठवणं संपलं
 | Connection close, FIN scan

 | RST
 | Connection लगेच reset/नाकारण्याचा संकेत
 | Closed port कडून reply

 | PSH
 | Data application कडे पुढे देण्याची सूचना
 | Interactive traffic

 | URG
 | Urgent pointer valid आहे
 | कमी वापर; Xmas scan मध्ये FIN+PSH+URG

SYN: connection सुरू करताना sequence numbers synchronize करणे.

ACK: acknowledgement field महत्त्वाची आहे असं दाखवतो.

FIN: माझ्या बाजूने आणखी data पाठवणार नाही—graceful close.

RST: connection तात्काळ reset/नाकारण्याचा संकेत.

PSH: buffered data application पर्यंत पुढे देण्याची सूचना.

URG: urgent pointer valid आहे. साध्या traffic मध्ये कमी दिसतो.

Graceful close अनेकदा FIN → ACK → FIN → ACK असा दिसतो. काही messages एकत्र येऊ शकतात; दोन्ही directions स्वतंत्रपणे बंद होतात.

SYN ला मिळणारे replies

 | Probe
 | Server चा reply
 | Nmap चा निष्कर्ष

 | SYN
 | SYN-ACK
 | open

 | SYN
 | RST
 | closed (host कडून reply आला)

 | SYN
 | Reply नाही / ICMP unreachable
 | filtered (filtering किंवा packet loss शक्य)

SYN-ACK आल्यास port open असल्याचा संकेत; RST आल्यास closed असल्याचा संकेत. Reply नाही किंवा काही ICMP unreachable responses असल्यास scanner “filtered” असा निष्कर्ष काढू शकतो. पण packet loss सारखी कारणंही असू शकतात, म्हणून एका reply वरून firewall निश्चित आहे असं म्हणू नका.

स्वतःच्या web-server lab मध्ये पाहा

sudo tcpdump -i any -nn 'tcp port 80 and (tcp[tcpflags] & (tcp-syn|tcp-fin|tcp-rst) != 0)'
# in another terminal: curl -s http://localhost > /dev/null   -> watch SYN, SYN-ACK, FIN

ही मूळ filter command SYN, FIN आणि RST दाखवते; SYN-ACK मध्ये SYN flag असल्याने तो दिसतो. Pure ACK मात्र या filter मध्ये दिसणार नाही. पूर्ण handshake पाहण्यासाठी आपल्या lab capture मध्ये TCP port 80 चा पूर्ण traffic पाहा.

Security मध्ये उपयोग

SYN flood मध्ये handshake पूर्ण न करता अनेक half-open states तयार करण्याचा प्रयत्न होतो. SYN cookies, rate limits आणि AWS Shield सारखं DDoS protection उपयोगी ठरू शकतं. SYN scan मध्ये SYN पाठवून reply तपासला जातो आणि पूर्ण connection ऐवजी RST दिला जाऊ शकतो; nmap -sS हा source मधला संबंधित option आहे.

Practice

स्वतःच्या web-server lab वर दिलेली tcpdump command चालवा. दुसऱ्या terminal मध्ये दाखवलेली curl command वापरा. SYN, SYN-ACK आणि शेवटचे FIN/RST शोधा. नंतर पूर्ण TCP capture मध्ये तिसरा ACK शोधून sequence/ack values जुळवा.

रवींद्र बागले यांची tip

योग्य क्रम SYN → SYN-ACK → ACK आहे. Closed port सहसा RST देतो; उत्तर नाही म्हणजे closed असं म्हणू नका. ACK म्हणजे पुढे कोणता byte अपेक्षित आहे. Diagram मधल्या SYN साठी +1 नियम लागू होतो, पण data segments साठी payload length विचारात घ्यावी लागते.
