전송계층 역할:
tcp가 다루는 패킷단위:세그먼트
세그먼트 안에 헤더와 데이터가 들어간다.
sequence number
데이터들을 한 세그먼트에 모두 담지 못할 것이다.
바이트스트림이 끊길텐데 이것이 한 바이트스트림이었음을 sequence number에 시작한 바이트스트림 index가 들어가 알게되고 후에 합칠 수 있다.
acknowledgement number
성공적으로 데이터를 전달받았음을 알림. 수신노드가 다음에 받을 데이터의 sequence number가 들어감.(잘 받았어요 다음에는 이 number로 데이터 보내주세요.)
tcp flags
tcp 세그먼트 기능을 표현함.
CWR,ECE
ACK
PSH
RST,SYN,FIN
window size
수신버퍼의 현재 여유크기를 알아야 적절한 크기의 데이터를 보낼수 있음(흐름제어)
수신버퍼의 크기를 window size에 저장해 보낸다.
tcp checksum
세그먼트의 데이터 무결성을 검사하는 비트
urgent pointer
긴급 데이터의 페이로드에서의 위치를 가리키는 포인트
3-way handshaking
4-way close
close할 때 sender가 wait하지 않고 종료되는 경우도 있다.
responder가 자신도 종료하고 싶어서 ack와 fin을 같이 보냄->
sender가 fin을 받아 closing 하고 ack 보냄->responder도 ack받아 close
sequence number에서 요청한 번호+1로 ack를 통해 데이터를 보내는 것을 볼 수 있다.
위에서 말한 wait하지 않고 종료되는 경우이다.
송,수신 측에서 데이터를 담을 수 있는 버퍼의 현 상태를 알아야 그에 맞는 크기만큼 데이터를 보낼 수 있다. 이를 위해 window에 버퍼의 여유크기를 저장해 보낸다.
윈도우의 크기를 통해 보내는 데이터의 양을 조절하는 식으로 흐름제어를 하고, ack를 몇 번이상 오류가 났음을 인지하면 혼잡 윈도우의 크기를 줄이는 식으로 혼잡제어가 가능하다.
user datagram protocol.
비연결형.
tcp와 달리 신뢰성 보장 안함.-> 순차적 전달,혼잡제어,흐름제어 수행안함
소켓 프로그래밍 api들
getaddinfo()로 IP주소를 받아옴.
프로그램이 클라우드에 올려지기도 하는 등 환경이 변하기에 getaddinfo로 주소정보를 받아온다.
sin_family
sin_port
sin_addr는 IPv4와 비슷하게 존재한다.
IPv6에서는 클론 으로 구분되는 16바이트 주소가 들어간다,
IPv6에서는 geraddrinfo()가 사용된다. gethostbyname()은 ipv4에서만 가능하다.