안녕하십니까 코딩 파인애플입니다
이번 시간에는 TCP와 UDP에 관해 알아보겠습니다.
Transmission Control Protocol
인터넷은 본질적으로 불안정적이기에 TCP를 통하여 안정적이고 신뢰성 있는 전송을 보장합니다
대표적인 특징들로는
신뢰성 보장 : 데이터를 작은 조각(패킷)으로 나누어 보낸 후, 유실된 조각이 있으면 다시 보내라고 요청하여 데이터 손실을 막습니다
순서 유지 : 패킷이 뒤바뀌어 도착하지 않도록 올바른 순서대로 조립합니다
연결형 통신 : 통신을 시작하기 전 3-way handshake 과정을 통해 연결을 먼저 맺고 신뢰할 수 있는 상태를 만듭니다
혼잡 제어 : 네트워크 상황에 맞춰 전송 속도를 조절해 과부하를 방지합니다
등이 있습니다
신뢰성이 높은 특징으로 HTTP/HTTPS, 이메일, 파일 전송(FTP), SSH 등에 사용됩니다

총 세 단계를 거쳐서 교환을 하는데 각각 단방향적으로 서로 패킷을 주고받습니다 뭐, HandShake (악수) 니까 서로 악수하는 게 더 어울릴련지
3-Way-Handshake는 다음과 같은 과정을 거칩니다
SYN (클라이언트 → 서버): 단방향 요청
SYN + ACK (서버 → 클라이언트): 단방향 응답 및 역방향 연결 요청
ACK (클라이언트 → 서버): 단방향 확인 응답
조금 예시를 들자면 코딩 파인애플과 제 친구 더미가 서로 게임을 시작했다 가정해봅시다
코딩 파인애플 (SYN) (확인) : 야이 @&%#@ㅑ!! &#@*야!!!
더미 (SYN + ACK) : (욕설 감지)
더미 (ACK) (반응) : ㅇ~ ㅄ ㅋ ㅗㅗ
(진짜 서로 게임 시작하면 이럶)
ㅔ...뭐 이런 식입니다 (...)
3-Way는 연결을 시작할 때, 4-Way는 연결을 끝낼 때 사용됩니다.
한쪽이 "연결 끝낸다" 라고 하더라도, 상대방이 아직 보낼 데이터가 남아있을 수 있기 때문입니다
따라서 양쪽이 모두 "정말 더 이상 보낼 게 없다"는 신호를 주고받아야 합니다
4-Way-Handshake는 다음과 같은 과정을 거칩니다
FIN (클라이언트 → 서버): 연결 종료 FIN 패킷을 보냄
ACK (서버 → 클라이언트): FIN을 받으면 잘 받았다는 ACK를 보냄
FIN (서버 → 클라이언트): 서버도 클라이언트도 끝낼 준비를 마친 FIN패킷을 보냄
ACK (클라이언트 → 서버): 마지막으로 확인용 ACK를 보내고 종료.
코딩 파인애플 (FIN) : 야 이거 재미없다
더미 : 그러게.
코딩 파인애플 : 걍 시마이 하실?
더미 : ㅇㅇ ㅂㅂ
User Datagram Protocol
UDP는 TCP와 다르게 패킷이 손실될 수도 있고 3-Way-HandShake도 안거치며 재전송또한 하지 않는 뭐, TCP 샌님의 못난 누이에 가깝지만...
TCP와 다르게 3-Way-HandShake를 거치지 않아 속도가 매우 빠르고 효율이 높다는 장점이 존재합니다
그래서인지 실시간 영상/음성 통화, 온라인 게임, DNS 조회, 스트리밍에 UDP가 주로 쓰입니다
그러니까... UDP는 최소한의 검증 장치로에 가깝습니다
체크섬이 과정은
UDP 패킷 안의 모든 데이터를 2바이트 단위로 쪼개서 모두 더하고 그 더한 값을 바탕으로 계산된 최종 결과를 UDP 헤더의 'Checksum' 칸에 적어서 보냅니다
패킷이 도착하면, 수신 측 컴퓨터도 똑같이 패킷의 데이터를 16비트 단위로 다시 모두 더해봅니다
만일, 직접 더한 값과 패킷 헤더에 적혀 온 'Checksum' 값이 일치하는지 확인하고 맞으면 올리고 틀리면 그 패킷을 재전송 없이 폐기합니다
예, 그냥 UDP는 무지성이 맞긴 합니다

뭐...사실 TCP는 이것 말고도 다룰 요소가 더 많긴 하지만 추후 글을 수정하면서 더 보완할 예정입니다
