
지금 크래프톤 정글에서는 직접 웹서버와 프록시 서버를 만들어보는 과제가 진행중인데요.
네트워크에 대해서 공부하는 과정중에, TCP/IP 와 UDP 에 대해 알게되었고
그 중, TCP/IP 프로토콜에서 사용하는 3-way handshake 에 대해서 포스팅 하려합니다.
CSAPP 책에는 나와있지 않아서 따로 정리해서 이해하려고 합니다.
3방향으로 악수하기? 3가지 방법으로 악수하기? 너 대체 뭔데 임마!
모든 네트워크는 동작하면서 결국 데이터를 주고받는데요.

데이터를 주고 받는 방식 2개가
예요.
UDP는요.
일단 던질게 받아!!!
데이터가 제대로 올바른지? 중간에 손상됐나? 나 지금 올바른 주소에 전송했나?
알빠아님 ㅋㅋㅋ 체크안해 ㅋㅋㅋㅋ "하지만 빨랐죠?" 입니다.
클라이언트에서 서버로 혹은 서버에서 클라이언트로 연결없이 그냥 데이터를 보냅니다
그래서 "비연결형(Connectionless)" 방식이라고 불러요.
TCP/IP방식보다는 훨씬 빠르지만, 전송 성공 여부도 모르고, 순서도 뒤죽박죽일 수 있어요.
이런 실시간성이 중요하고 약간의 데이터 손실을 허용할 수 있는 상황에서 많이 쓰입니다.
TCP/IP는 UDP와 다르게 "연결지향(Connection-oriented)" 방식이예요.
UDP는 데이터 걍 보내버리잖아요.
TCP/IP는 데이터를 보내기전에 서버랑 연결을 먼저 맺고 데이터를 보내요.
그래서 정확하게, 순서대로, 빠짐없이 데이터를 전송하죠.
등에 쓰여요.
이렇게
UDP는 안전하지 않지만 빠르고
TCP/IP는 조금 느리지만 안전하다는걸 알았어요.
그래서 서버랑 데이터 주고 받기전에 먼저 서버랑 연결하는 방법!
그게 3-way handshake입니다.
TCP/IP는 연결을 맺기 전에 총 3단계를 거쳐요.
그래서 3-way handshake 라고 부르는데요.
SYN보내기 ( 연결 요청 )SYN + ACK 보내기 ( 수락 및 응답 )ACK 보내기 ( 확인 )이렇게 3가지 과정으로 이루어져요.

SYN과 ACK에 어떤 내용이 있는지 좀 더 자세하게 알아볼게요.
메시지 구성:
SYN 플래그: TCP 헤더에서 SYN(Synchronize) 플래그가 1로 설정됨. 이것은 “나 연결을 시작하겠다”는 요청을 의미해요.
초기 시퀀스 번호 (ISN): 클라이언트는 자신이 사용할 임의의 초기 시퀀스 번호 X를 선택하여, 이 값을 TCP 헤더의 시퀀스 번호 필드에 넣어요. 이 시퀀스 번호로 데이터 순서를 보장하고, 손실되었을 경우 재전송을 요청하는 용도로 써요.
윈도우 크기: 클라이언트가 수신할 수 있는 버퍼 크기를 나타내어, 흐름 제어에 사용돼요.
기타 옵션: 필요에 따라 최대 세그먼트 크기(MSS) 같은 TCP 옵션들도 포함될 수 있어요.
의미:
이 메시지로 클라이언트는 “나는 X라는 시퀀스 번호로 연결을 시작하고 싶다”는 의사를 전하고 이때 연결은 아직 설정되지 않은 상태이며, 단순히 연결 생성 히고 싶어요...!!!
메시지 구성:
SYN 플래그: 서버 역시 자신이 연결을 설정할 준비가 되었음을 나타내기 위해 SYN 플래그를 1로 설정해요.
ACK 플래그: 서버는 동시에 클라이언트의 SYN 메시지를 받았음을 확인하기 위해 ACK 플래그도 1로 설정해요.
서버의 초기 시퀀스 번호 (ISN): 서버는 자신이 사용할 임의의 초기 시퀀스 번호 Y를 선택하고, 이를 시퀀스 번호 필드에 기록해요.
Acknowledgement Number: 서버는 클라이언트에서 받은 시퀀스 번호 X를 바탕으로 “내가 받은 데이터가 X임을 확인하며, 다음으로 기대하는 번호는 X+1이다”라는 의미로 ACK 번호 필드에 X+1을 설정해요.
윈도우 크기와 기타 옵션: 서버가 수신 가능한 버퍼 크기와 옵션들도 이 단계에서 설정할 수 있다.
의미:
SYN+ACK 메시지는 “너의 연결 요청을 받았고, 나도 연결할 준비가 됐다”는 뜻이예요. 서버는 자신의 시퀀스 번호 Y를 제시하며, 클라이언트가 보낸 첫 번째 패킷의 시퀀스 번호를 확인하고 그 다음 번호로 ACK를 보내 연결 설정을 승인합니다.
메시지 구성:
ACK 플래그: 클라이언트는 자신의 헤더에서 ACK 플래그를 1로 설정하여, 서버의 SYN+ACK 메시지를 받았음을 확인한다.
Acknowledgement Number: 클라이언트는 서버의 시퀀스 번호 Y에 대해 “내가 잘 받았으니, 다음으로 기대하는 번호는 Y+1이다”라는 의미로 ACK 번호 필드에 Y+1을 설정해요.
시퀀스 번호: 클라이언트는 이전에 보내고 SYN 메시지에 사용했던 시퀀스 번호 X에 기반한 번호(보통 X+1, 왜냐하면 SYN 메시지가 한 바이트의 시퀀스로 간주되기도 함)를 사용해요.
윈도우 크기 및 옵션: 추가적으로 클라이언트의 수신 여유 공간과 필요한 옵션들이 포함될 수 있다.
의미:
이 최종 ACK 메시지를 통해, 클라이언트는 서버의 응답을 확인하고 연결이 성공적으로 설정되었음을 확정합니다.
이제 양쪽 모두가 상대방의 시퀀스 번호와 흐름을 인지하였으므로, 안정적 데이터 전송을 시작할 수 있습니다.
이렇게 TCP/IP가 안정적으로 데이터를 주고 받기 위해서 3-way handshake를 사용하고
그게 어떤식으로 메세지를 주고 받는지 알게 되었어요.
UDP에 더해 이런 연결요청이 선행되기 때문에 더 느린거겠죠?
다들 에코서버 제작 화이팅입니다
하나 둘 셋!!!!
짱구야~~
으....으ACK