2016. 12. 14. 12:57

안녕하세요. 게임개발자 놀이터 입니다.


이번 포스팅에선 TCP 3-way Handshake 에 대해서 적어볼까 합니다.


사실 전 이번 포스팅에 대한 내용을 잘 모릅니다.


관심있게 배우지 않았고, 나중에서야 이렇게 후회하면서 다시 공부를 했습니다.


정말 참고한 사이트가 많으니, 참고 사이트는 최하단에 적어 두도록 하겠습니다.




TCP 3-way Handshake 란?


TCP는 장치들 사이에 논리적인 접속을 성립 하기 위해 3-way handshake를 사용합니다.


즉, 신뢰성 있는 연결을 체결하기 전에 패킷을 3번 교환하여 확인 하는 과정입니다.


왜 3번 일까요?


A와 B가 서로 멀리서 대화를 한다고 생각해 봅시다.


A가 B에게 말합니다. "B야 우리 놀러가자!"


B는 그걸 듣고 대답하죠. "뭐? 나한테 말한거야?"


A는 B의 말을 듣고 말합니다. "응 너랑 둘이서 노는거야!!"


A와 B의 대화가 서로 이어지지 않습니다. 오히려 잘못된 정보를 받고있네요.


A와 B는 서로간의 신뢰성있는 연결이 되어있지 않다고 말할수도있겠네요.


이번엔 3-way handshake로 예를 들어봅니다.


1. A가 B에게 말합니다. "B야! 내말 들리니?" --- SYN

2. B는 그걸 듣고 대답합니다. "응, A야 난 들려, 넌 내말 들리니?" --- ACK / SYN

3. A가 말합니다. "응 B야! 너 말 잘들려!" --- ACK


이렇게 3번에 걸쳐서 대화를 주고받으며 신뢰성있는 연결이 체결되었습니다.


위 내용에서 말하는 것을 패킷으로 생각하고, A를 Client, B를 Server로 생각하면 이해하실수있습니다.


- Client에서 웹 서버로 연결을 시도하는 SYN을 보냅니다.

- Client는 서버의 응답을 기다리며 SYN-SENT 상태가 됩니다.

- Server는 LISTEN 상태에서 SYN데이터를 받으면 SYN + ACK패킷을 Client로 보냅니다.

- Server는 SYN_RECEIVED상태가 됩니다.

- Client는 Server로 SYN에 대한 응답으로 ACK패킷을 보냅니다.

- 그후 Client는 ESTABLISHEN 상태가 됩니다.

- Server는 ACK 패킷을 받고 해당 Client IP 대한 포트 ESTABLISHEN 상태로 전환합니다

- 이것으로 TCP 3-way handshaking 을 완료합니다.

사진 출처 : HandShake Wikipedia




위 사진 과정에서 Sequence Number와 Acknowledgment number를 보실 수 있습니다.

먼저 Client에서 SYN 패킷을 보낼때 Sequence Number에 랜덤한 숫자를 넣어서 보냅니다.

편의상 x라 표현하겠습니다.

이 SYN 패킷을 받게되면 응답으로 SYN + ACK 패킷을 보내게 되는데 서버에서 보내는 Sequence Number의 경우 또 랜덤한 숫자를 넣어서 보냅니다(y), 그리고 Acknowledgment number는 클라이언트에게 받은 x에 +1하려 x+1 값을 보내게 됩니다.

클라이언트는 서버로부터 오는 SYB+ACK를 받고 응답으로 ACK패킷을 보내는데 역시 값은 서버에게서 받은 Sequence Number, 즉  y 의 +1한 값인 y+1을 보내게됩니다.



감사합니다.






참고 사이트

넷트레인 교육센터

개발이 하고 싶어요

Mind Net

Mint & Latte

Posted by 시리시안

댓글을 달아 주세요